{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  第5章 python正则表达式\n",
    "正则表达式是一个特殊的字符序列，它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块，它提供 Perl 风格的正则表达式模式。\n",
    "   就其本质而言，正则表达式（或 RE）是一种小型的、高度专业化的编程语言， （在Python中）它内嵌在Python中，并通过 re 模块实现。正则表达式模式被 编译成一系列的字节码，然后由用 C 编写的匹配引擎执行。\n",
    "   re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。 re 模块也提供了与这些方法功能完全一致的函数，这些函数使用一个模式字符串做为它们的第一个参数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本文主要从以下方面来介绍Python正则表达式的使用：\n",
    "\n",
    "一、 基本规则\n",
    "* 功能字符\n",
    "* 规则分解符\n",
    "* 预定义转义字符集\n",
    "* 及其他功能字符的介绍\n",
    "\n",
    "二、 组的用法\n",
    "* 无命名组\n",
    "* 命名组\n",
    "\n",
    "三. 基本函数\n",
    "\n",
    "findall/compile/match、search/finditer/sub、subn/split"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 基本规则"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.1 功能字符\n",
    "'.'、 '*' 、'+'、 '|'、 '?' 、'^' 、'$' 、'\\'等，它们有特殊的功能含义。特别是'\\'字符，它是转义引导符号，跟在它后面的字符一般有特殊的含义。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['123', '456', '789']\n",
      "['123\\n456\\n789']\n"
     ]
    }
   ],
   "source": [
    "\"\"\" . 匹配所有字符 \"\"\"\n",
    "# 匹配除换行符'\\n'外的所有字符\n",
    "\n",
    "import re\n",
    "s = '123\\n456\\n789'\n",
    "print(re.findall(r'.+',s))\n",
    "print(re.findall(r'.+',s,re.S)) # 如果使用'S'选项，匹配包括'\\n'的所有字符"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['12', '56', '100']\n",
      "['12']\n",
      "['34', '78', '100']\n",
      "['100']\n"
     ]
    }
   ],
   "source": [
    "\"\"\" ^ 匹配字符串的开头 \"\"\"\n",
    "\"\"\" $ 匹配字符串的末尾 \"\"\"\n",
    "s = '12 34\\n56 78\\n100'\n",
    "print(re.findall(r'^\\d+',s,re.M)) # 匹配位于行首的数字\n",
    "print(re.findall(r'\\A\\d+',s,re.M)) # 匹配位于字符串开头的数字\n",
    "print(re.findall(r'\\d+$',s,re.M)) # 匹配位于行尾的数字\n",
    "print(re.findall(r'\\d+\\Z',s,re.M)) # 匹配位于字符串尾的数字"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['I have a dog', 'I have a cat']\n",
      "['I have a dog', 'cat']\n"
     ]
    }
   ],
   "source": [
    "\"\"\" | \"\"\"\n",
    "# 将两个规则并列起来，以‘ | ’连接，表示只要满足其中之一就可以匹配。\n",
    "# 比如[a-zA-Z]|[0-9] 表示满足数字或字母就可以匹配，这个规则等价于 [a-zA-Z0-9]\n",
    "# 不过使用的时候需要注意两点：\n",
    "# 1、它在 ’[‘ ‘]’ 之中不再表示或，而表示他本身的字符。如果要在 ’[‘ ‘]’ 外面表示一个 ’|’ 字符，必须用反斜杠引导，即 ’/|’ ;\n",
    "# 2、它的有效范围是它两边的整条规则，比如‘ dog|cat’ 匹配的是‘ dog’ 和 ’cat’ ，而不是 ’g’ 和 ’c’ 。如果想限定它的有效范围，必需使用一个无捕获组 ‘(?: )’ 包起来。\n",
    "\n",
    "# [a-zA-Z]|[0-9] 表示满足数字或字母就可以匹配，这个规则等价于 [a-zA-Z0-9]\n",
    "s = 'I have a dog, I have a cat'\n",
    "print(re.findall(r'I have a (?:dog|cat)',s))\n",
    "print(re.findall(r'I have a dog|cat',s))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['aaa', 'bbb111']\n"
     ]
    }
   ],
   "source": [
    "\"\"\" * 表示匹配前面的规则0次或多次 \"\"\"\n",
    "\"\"\" + 表示匹配前面的规则1次或多次\"\"\"\n",
    "s = 'aaa bbb111 cc22cc 33dd'\n",
    "print(re.findall(r'\\b[a-z]+\\d*\\b',s))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['123', '10e3']"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\" ? 只匹配前面的规则0次或1次 \"\"\"\n",
    "s = '123 10e3 20e4e4 30ee5'\n",
    "re.findall(r'\\b\\d+[e]?\\d+\\b',s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['/*part 1*/code/*part 2*/']\n",
      "['/*part 1*/', '/*part 2*/']\n"
     ]
    }
   ],
   "source": [
    "#'*'、'+'、'?'通常都是尽可能多的匹配字符。\n",
    "s = r'/*part 1*/code/*part 2*/'\n",
    "print(re.findall(r'//*.*/*/',s))\n",
    "# 如果在*后面加上?，则尽可能少的匹配\n",
    "# '*?'、'+?'、'??'最小匹配\n",
    "print(re.findall(r'//*.*?/*/',s))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.2规则分解符\n",
    "'[ ]'、'( )'、'{ }'等"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['hello', 'o', 'l']\n",
      "[' w', 'r', 'd']\n"
     ]
    }
   ],
   "source": [
    "\"\"\"[  ]的使用\"\"\"\n",
    "# [...] 用来表示一组字符，单独列出:[amk]匹配'a','m','k'\n",
    "# [^...]匹配不在[]中的字符：[^abc]匹配除了a,b,c之外的字符\n",
    "\n",
    "s = 'hello world'\n",
    "print(re.findall(r'[helo]+',s))\n",
    "print(re.findall(r'[^helo]+',s))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['333']\n",
      "['22', '333', '4444']\n",
      "['55555', '666666']\n",
      "['1', '22', '333', '4444']\n"
     ]
    }
   ],
   "source": [
    "\"\"\"精确匹配和最小匹配\"\"\"\n",
    "# '{m}'精确匹配m次\n",
    "# '{m,n}'匹配最少m次，最多n次 (n>m)\n",
    "s = '1 22 333 4444 55555 666666'\n",
    "print(re.findall(r'\\b\\d{3}\\b',s)) # 匹配3位数\n",
    "print(re.findall(r'\\b\\d{2,4}\\b',s)) # 匹配2位数到4位数\n",
    "print(re.findall(r'\\b\\d{5,}\\b',s)) # 匹配5位数以上的数\n",
    "print(re.findall(r'\\b\\d{1,4}\\b',s)) # 匹配4位数以下的数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['111']\n"
     ]
    }
   ],
   "source": [
    "\"\"\"前向界定与后向界定\"\"\"\n",
    "# '(?<=...)'前向界定\n",
    "# 括号中'...'代表你希望匹配的字符串的前面应该出现的字符串\n",
    "# '(?=...)'后向界定\n",
    "# 括号中的'...'代表你希望匹配的字符串后面应该出现的字符串\n",
    "s = r'aaa111aaa,bbb222,333ccc'\n",
    "print(re.findall(r'(?<=aaa)\\d+(?=[a-z]+)',s))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 注意：在前向界定括号中的表达式必须是常值，也就是不可以在前向界定的括号里写正则式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['222']\n"
     ]
    }
   ],
   "source": [
    "\"\"\"前向非界定与后向非界定\"\"\"\n",
    "# '(?<!...)'前向非界定\n",
    "# 只有当你希望的字符串前面不是'...'的内容时才匹配\n",
    "# '(?!...)'后向非界定\n",
    "# 只有当你希望的字符串后面不是'...'时才匹配\n",
    "print(re.findall(r'\\d+(?!\\w+)',s))"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0EAAAIICAYAAACo3eXJAAAgAElEQVR4Aezd32tU1x7//1cP/Qe+iqXYYpzSK38ELwZyapqExoKkFHNRPUSIuYheRPyVC2ulHHORlGJTL0yqNF/QfCEG9HvSc5EilUDNIbHRBoYvEqNX/XSM2FKU5F/ol7X23jNr79nzI5ox48wz0GbP/rH2Wo+dGfd7v9da88bi4uLf4gcBBBBAAAEEEEAAAQQQqBGBN007t2/fXiPNpZkIrK3Aw4cPef+sLSmlIYAAAggggAACZRf4R9nPwAkQQAABBBBAAAEEEEAAgQoSIAiqoItBVRBAAAEEEEAAAQQQQKD8AgRB5TfmDAgggAACCCCAAAIIIFBBAgRBFXQxqAoCCCCAAAIIIIAAAgiUX4AgqPzGnAEBBBBAAAEEEEAAAQQqSIAgqIIuBlVBAAEEEEAAAQQQQACB8gsQBJXfmDMggAACCCCAAAIIIIBABQkQBFXQxaAqCCCAAAIIIIAAAgggUH4BgqDyG3MGBBBAAAEEEEAAAQQQqCABgqAKuhhUBQEEEEAAAQQQQAABBMovQBBUfmPOgAACCCCAAAIIIIAAAhUkQBBUQReDqiCAAAIIIIAAAggggED5Bd4s/yk4AwI1KnD/opJHxktr/O5zmhpO6FqyW7FH7O5Up8Y1ftcprmtUqZP1zopgcUEXk1eV+GlI7W8F62J+P5vUqU8GNBezKVjV2DeloX0b7cuF4VNKdwypXZM69ZXUN9yuP4aTmm5OqXdzdp23d1BC9Hfxui0MJ9U9Fj0u8tptewntCB/dqHOBjTn2RkJDsY7eUcs/nlK/+jIOkmnDtFpTvQr0zT57Hx9WqiPtmdrr2a7CFuFa8QoBBBBAAAEEXp1A/iDI3Bz4Nzr8Q/7qLghnqjIB52bd3NzbgGGXlHtj7bW7N5VSb3CTfUXqnm11Ap1e9QY8JsCaDV5Ef9er90pCyU8uKuHcqEf30p9pzQX1s+W555J0/6JOPckeVX/ysKaTF7XwU8Ku/GU4qbQJgHaZfdPSx4dKuOkvXrf6kymlTkrK8xlkHK9ufSdbsbfaNZRqz742SzYwSutwofY7R9gg5udWTQ37gYtzbmc3u7j841XpylAmADIrN25JSI8lxdUlWgCvEUAAAQQQQGDdBfIHQW8llLg7rT/MP/DrXk0qgAAC8QLLmjy5VwNuhsjZsTsZySs5GYrlJ2k1BsHErl6NziZ16sds5sdsz/6Y7IeXpRr/xFs7Z845lpSupNQ6O665sXEl+4MjTLalT/rqxeoWlJLz+9mkro516nBqbT+VNu4bUuqfkzo1vFAwK2SCq/7HhzW0T8pkxjLZtrQmT3Znr4VjndMOViCAAAIIIIDAugrkD4JUr9aubk3f71W9edLLDwIIlF3A7Qo2fsScblzJMcntlpZbCad7V+7G7Bo/uxGs+OPxnBLN2WCi/uSUWk/2a/Kfcd3o6pXNUnVrPHSDv6CLo+c0lfKyKF7Gy5SxrEm9WN2COurutH551p7p1rf867Tmug5rKLPDGiz8ltbkcLcG/C54ybFOjfrZrmjpCzfSOnyy3WaarqpVrV8llXQC0PSVlFLD0aN4jQACCCCAAAKVJlAgCJLe2dqo9JNlaZfs0+Z0t9/1xXbX6bZPgG1XGPu6hDEIldZ66oPAKxVoVGJz8RN2XhmVjkyr1e8ON7X1qkyCxQ2QbCldrTZP2z5sQoJspib2DLbbW7uGzA26O1ZpLJk7BumTpAYyhexVst8PZMxYoE8GpK5ONY4NaG9y2o6t+fDXaZmcUTZrHLRzo1Zdt8x5Jdtdz4xY+nVZ7XZc0rJ++XlOujtnA0OFAjH3wGA5rasnk5qTGW8VHZ8T8fp4Sik3u/RsMigk+9tmobyMl9SpUdvVrl22I54fYB7igVHWiyUEEEAAAQQqWKDg7HAb/9kq/fyLlrVRH37cqPHZBa8p96eV3h1+Pb67VR9muoVUcIupGgLrIrCs9G8lnvhJWundCTmjXjIHdppMQyql1JXOzDpvwcvU2G1mu//fVF+jZLIxHcEQfkm7epVKTencbhPcePua/TJl+8eOdslf50+G8Mm0Wn9KaagjIRuApA4r/UlSe39O6PDHaU3fNzVZ0PRYQonQZ8Eq6ua0ynbX6xtV68/X5H3ymKDKq6+pW+PHHxbtqtv67ymdkwnYTmnymVO4gjqNqnP3OfX5kz/YAHHY/5xzdzfLdryPZ995JTspQna3tK6dTCqZDP6LnjO7J0sIIIAAAgggsL4CBYMgvfWhWmW6o/gDf39La1mSuTlJdB9Wp/96YXa8pBuS9W0qZ0dgPQX+UPpuNDjw62OyCCcn7XvLrBnvH5DMDf7mhBrHurW3P2b+NhPIFJjRzJRjMkd7+xMaTcV1bwvXZ+O+PiVGk7poA5kYJxsABMFQWodtZsUPJIbbVb8l4WWN709rvKs1NGlATGlF6uYdYbvrbalXe7fU7QYmwbigIHCJO4FdZ7z9wOlKQgOfmDFP5hPM/XlHCaVtFsvLkEmjBV2XNfmk1ZsMQmY8lh/wmFn27o5L3dkANBXr7p6bZQQQQAABBBBYL4GC3eHMlAiJ9+c0/ad5etyqzrtX9cuzD6WfpcS/zXNq//VvjWrtyI4tWK/GcF4EKlXAzCg23nU4O7ubW1EzS9v7rTarYbqUmYyM183Um/XMm0nOPcBZdru2Oauzi+OKTo5gy98czTaZYGFUF00wluk6FnRrC2Zby06nPRdMuBB0SdvVqsSRa7rYNa7OZn8Ouxetm+1SZjJKjUp0mAzMIZ0b3auL943Lsia/GpD6pooGWlmDIPt1yHbrvbgl8DV7mM+4cU0Py07L7XVxCx0ZerEwvNeOHRqwE0CYLnEppeweJiDql/zujiYAvbo1O8lEqBBeIIAAAggggMC6CxQJgqT65k51zy6od5eZKMEEROY2rVWH3toofSxd+/UXpdWqvlD3l3VvFxVAoHIEzIxi/dK5n7Jd0mxX00/MeBuvmqZ7VfAzfiR3nE5jX7A1+9ubgMBkHrLHZrbGTXmd2ehNaW0yF3uT2dE/weZxd91YUgPBeKIraSVHE5nxNV5wFnRJq9ehvqva+/M5TZnprc2P7Xb3AnUzx5qM0u5WTdnPFT9AS57Sqd1z3hifolkgrwrh/3tZofA6b+zjeL/8MT7Rre5rv0tjMK24u8l/YHT11wXp524NvD+q1AvVMVQoLxBAAAEEEECgTAJFgyCbARo13eDq7UQJ46NX1fj+Ya8vvukCMzotfdxXtG9+mepPsQhUuEDaZi4SV1KZGc5shQt8n0w2E+Q1rWAm6EVbny9AccoLgiwvK2VG+7Qq1T1tx7zY3Www4GeAbaBnuu3N6dr9dj+T5RS2qsUFXTwybjNimfzys7TSmpOZlrvzSnSSg1UV7uzsTo7gffeR2Wi8r20Z8iaRMK8zR3hBVGYihE8GZK5r4GMeGM0d6bbrUru87ojB90JlimABAQQQQAABBCpCoPCYIFtF02feHxf0z1Y13p2Tgu8W2ZyQ7kqt/8zcqlREo6gEApUjkLCD+YMb5VLqZTJB2cH1ZlxPzJggmayE012tlIJXtY/fHc2Zza5+V73M+D/z09l3zo5XsmNsTNbJDwhSP51T+kiBsUUl1GFhuFvjXaPhcTf+pAxmwofWWeNz0Z8soYQC43Yx47CS3gyXpsypvrS67bgsMwOd8s/iZ49LKmm+SNp8sa39otiL3vUalTp3S+OjZnxXrl9cNViHAAIIIIAAAusjUDwTJPP0M/hWjsg3sxd4mr0+zeGsCFSYwFi3N51z0Wp5Uy6b3fJlgmzXVLernMnEhLqhhr841e1iV/T0ZofoGB63fHPzb6bH7nOmkt7XbrMmySNm8oWUP0bHfEYkdNHMxvaTOyFDiXXzJz0YTdVn6mM83O/eqT+ZUuqkyeIk1V3q9xBFASKfXebLUqd0yuseaMY5veVmicwsehvtdwOd+iStw6mU9z1FgZdxynRJPKTEyb3am5Tk+kXPz2sEEEAAAQQQWFeBNxYXF//evn37ulaCkyPwugo8fPhQvH9e16tHvRFAAAEEEECgVgVK6A5XqzS0GwEEEEAAAQQQQAABBKpRgCCoGq8qbUIAAQQQQAABBBBAAIG8AgRBeWnYgAACCCCAAAIIIIAAAtUoQBBUjVeVNiGAAAIIIIAAAggggEBeAYKgvDRsQAABBBBAAAEEEEAAgWoUIAiqxqtKmxBAAAEEEEAAAQQQQCCvAEFQXho2IIAAAggggAACCCCAQDUKEARV41WlTQgggAACCCCAAAIIIJBXgCAoLw0bEEAAAQQQQAABBBBAoBoFCIKq8arSJgQQQAABBBBAAAEEEMgrQBCUl4YNCCCAAAIIIIAAAgggUI0CBEHVeFVpEwIIIIAAAggggAACCOQVIAjKS8MGBBBAAAEEEEAAAQQQqEYBgqBqvKq0CQEEEEAAAQQQQAABBPIKvLG4uPh33q1sQAABBBBAAAEEEEAAAQSqTOBN0573tr5bZc2iOQi8GoHfHz/l/fNqqDkLAggggAACCCCwZgJ0h1szSgpCAAEEEEAAAQQQQACB10GAIOh1uErUEQEEEEAAAQQQQAABBNZMgCBozSgpCAEEEEAAAQQQQAABBF4HAYKg1+EqUUcEEEAAAQQQQAABBBBYMwGCoDWjpCAEEEAAAQQQQAABBBB4HQQIgl6Hq0QdEUAAAQQQQAABBBBAYM0ECILWjJKCEEAAAQQQQAABBBBA4HUQIAh6Ha4SdUQAAQQQQAABBBBAAIE1EyAIWjNKCkIAAQQQQAABBBBAAIHXQYAg6HW4StQRAQQQQAABBBBAAAEE1kyAIGjNKCkIAQQQQAABBBBAAAEEXgcBgqDX4SpRRwQQQAABBBBAAAEEEFgzgTfXrCQKQgCBsMCDETUdnwivy/eq4bQmB+t0veWEbsTt03BAHZrQjXln48HvdKdnm7PCLD7S5ZZZtcz0aEdoObJbzktz3Ljqfvhan27K2Zhd8fyWzuy/oHvZNTlLH5yd0GDbBrt+ceRLPf7sa32qWzrzrXR2sE1/juzRTONtHXs7u87bO6cof0Xxui2O7NHR6/mO99e7XiW0I1xag74IbMyx/63TYI599oiVW1/qvE5nHMLXxdvP7NO+1Kk7ny15pvZvoE2FLbLnYAkBBBBAAAEEXlwgfxBk/qH3b1rMP8rmJmOsLntzY07p3Xgc0Pf2hsuvhL25uKPm4IbhxevGkQi8/gLOjbd5v9ib/51S7k2y19RjM7d1LAheLklH55qdQKdHxwIRE2DNBS/W4vc2Hbu0RU37R7TVfT9Hi/5rSfeCNtk6uPWT9GBEZ55mD9rR06mZlhEt/lBnV94d2aMlEwDtNPsuSR/9q4Sb/uJ129FzW3d6JEU+t4KaeJ9fbwcvpU1tGpxpy742S/aza0ldhdrvHGGDmP81aXLQD1ycczu72cWVW+PSpa+1w9mw4d0t0pLi6+LsxyICCCCAAAIIrL1A/iBoU53q5mf1p2RvUjbXNeje/+a10hY8qVzR498b9EHDhGYe9GiHuamRtJK6o3sNTTpb6Gny2reDEhGoUQGTJYlmjw6oJaMxoaMtbjbKPLT4lx6fOaBv3KxSZn9F9pfkZChWnj7RB3V+MLGzR9/P7dGZW9mHI2Z79idbtxv7vbX3zDmv75Eu3VbL3ITuXZ9Q0/ngCJNtOS19+2J1C0rJ+f38lsauH1DXzNrmWDa0fa07yVs6M/KoYFbIBFfnlzo12GYeHPmZsczn45JunjmRvRaOdU47WIEAAggggAACayaQPwjSNrUcPJEJcDYkm/TB+aVMUKTn85pVk7o+ksaerkg7vRuMP5fm9cFHp0t4urtmbaAgBKpGwMuues25cdz8nlDTdcntYhZu7DZ52aNgrQk8ZoMXkiKZWrtlRY/ldO9y9s5Z9LMbwXrz/q5rzAYTO3om1Hzmgm4m47rRBXXzg6HQDf4jXb52WpMz3kMVL0tmyljRzResW1BHzd/R3edtmW599sHMwU4NZnZYg4Xfl3Rz5IS+8bvgNV0/oO/9bFe09MX/Lqmrp81mmsbUpOZv96jJCUCXLt3WnTWtXLQGvEYAAQQQQACBqECBIEgy2Z+lIMAxmSHd0ePn0g7zFNN0i3mvWYNJSd8GGSKTHVLoJil6Ql4jULsCDQqSKIUMOi59Jx2fVYvfHW6yblwmWeIGSPb4g82FiimwbYM+HfzaHz8UzSI5h9lub20aNDfo7vim63tyxy3t36NvMoceUNN5P8gyY4H2X5AOHtAH1y+oveWOHVuzOzVre4IFmWYpsHmBumXO638uaV5KrehTOy5pRXf/Ny/Nz9tg0s1quYdll59o7Mwe3ZMZoxVkvYOt2cyWXfPRhO642aXnt4Ids79tFsrLeGUD0jZ9avbwA8yDfhY9exBLCCCAAAIIIFBugYJBkMn+ZAMckxma15h/c7E4N6GOxh5pk1Q3P+4/ef1LS/MH1MJTzXJfN8p/7QS8BwQlVfvpkpYa6rTZhgnhIzouBeNpgjFBK7qZ07WtQHe4UDYmyNSEz2HHupyXvvjMmXRhZ4/uzPxLN89ckD73sj5mv+vvfu2N7/GL8DI6fh3NTf5+Mz7wtjcxwu/B5A979E3DaX3/0R3NPJB27Hykmetb1GLG9GR+VlG3zDGS7a539js1/+8/Wmwzk0OYoMqcPxjX2FA0S938+YSavz2QCdiyE0UEdXqky2eWdNCf/MEGiGbs1mdORYLFYOzRgxFdlqlP9GdJ18/scSa8KDFDFy2G1wgggAACCCCwKoGCQZA2NahZFzJdS+y4oKW/7AnMeKA6+4++FxzNmNV/zerGwebs4O1VVYWdEahmAfOAYItaMmNBnLb6GQEzc5r5uXH+gu3+tuFt6YPrJ9Qu0x3O2d8smqDEzyAEN/neHqV0h4uU5bz0sk1xXejMTuE2bGg7rboze3T5kB/0OOXYxSAAsMGQN+GA6UiX6b73YMnrSqvSPjcK1807uddd72t9emhWTSOPspNKlDwuaIu2btqgHSZwMtmv/Xs068x2553lbdXJHy9pM2TS9zPbpOdmloO4nxXdfNqsY/by5gatdXSHi0NjHQIIIIAAAmUVKBwEaYO2vjcvG+Bskuy4oP8taeX5kh0PFEx+sKPxgI7OPdLBOmfQdFmrTeEIvF4CZnawGwc74x8Q+F1LTYBguodlsj3yZjDzZpJbw/a6Xdtii41OpuDX6e0gQxUcZLIs3+nymVtayXQdC7q1BbOtZafTvhdM0BBko3Y2q+74f3T5oJ9VNsW+aN1sQGgySv7DmU3/0hfXDujyAxOgrejmtxeksxMxmZigLTG/M9mvA7r8rhvomc/FCc2MyE7LHZodM6aYxZEDduzQN3YCCBNg3tYdu58JiC5I/jwTJsiLzsAZUxyrEEAAAQQQQGANBIoEQVIQ4BzbuU0KZoz7S3Y8UGZ49Nt1+uD3Jd2V1PxZZu0aVI8iEKgCATM7mOle9kO2e5ntarrfjJ3x2tdxKdsX7Mbx3DE3OZkgv3tXMOX2qpTszX32fJljTQASmpI7s8VbeLCke/MTam+5ENkg3XDXXd+jb4LxRJeW1HStLjO+xgvogi5p23Tw7Lja/3dak0F1XrRupkYPZnWjoUmTNtvmB2gtX+pMw7w3xifovpZT+0IrvO500T1MVvzGeZMBiuvi5u7td4MMphV3N/kPmcZSj6T/ndA3732nOy9Ux1ChvEAAAQQQQACBEgSKBkHa2ayOa0ta0TZtsDPGjWtmTupozN7QBd3mZn/foq647j4lVIRdEKhOgSWbhTBdnrJjSwp/N0w2E+SJFMwE/Z+4L2QtMCYolGlapXi+AMUpJjQmyARqatYd0zWtZY+3lw0G/AclNjg006TN6/qDttDYIqfIEhcf6fLxCZtFyzyGeb6kJc3LTMvdcSk6yUGJxebs5k6OsCWzNRgfZSeRMF8VkNmSHZPkfQ/RBZm/Bfs9SfIeMt07fsKuM90bo36ZYlhAAAEEEEAAgTUV+Efx0kz/dzPlrLfn5jrpxnVFZrnyus2Z2eJyB/4WPwN7IFC9AnV2YH5w01tKO00myAQNwX/t5535lDMFeN/TVddoJiy47fz3nToy+5gFv/uVs89q6hIqqugLvzua852kO3Zuk5lExfx0nD1txzidubXidXvb7wUEd344raXje3T5QdET5N1hceSEbhz8zg8uTDezPWryJ2UwPi1zxnNEi3lLKGGDGdvUcsJ+x5Epc/LsEx01XQFlZqCLfiY65dnj9qjJfPm0+TJc03XPZN3MNb4mdTRIN66ZcnL9nFJYRAABBBBAAIE1FCieCbKzK5npdL0f+wWBkS9aN1vsN7YHO/EbAQQ8gesnvKmZi3p4kxGY3fJlgmzXVLernMmqvHTmNTxQ3+2WV7TKZofoGB63TnZCBG8sTmYq6bY2maxJ0/EtdmyM99DEjH2q0+WWL3XzB/f7hkqsmz/pgZ2cwK+PMXS/e8d+PvWYLM4eHS31e4iiAMFED/5681k4qS+97oFmnNMmN0tkZnnb4E2Dvd9MCnHb+56iwMs4zQR9AP+lujNmNjpJrl/0/LxGAAEEEEAAgTUTeGNxcfHv97a+u2YFUhACtSTw++On4v1TS1ectiKAAAIIIIBANQiU0B2uGppJGxBAAAEEEEAAAQQQQAABT4AgiL8EBBBAAAEEEEAAAQQQqCkBgqCautw0FgEEEEAAAQQQQAABBAiC+BtAAAEEEEAAAQQQQACBmhIgCKqpy01jEUAAAQQQQAABBBBAgCCIvwEEEEAAAQQQQAABBBCoKQGCoJq63DQWAQQQQAABBBBAAAEECIL4G0AAAQQQQAABBBBAAIGaEiAIqqnLTWMRQAABBBBAAAEEEECAIIi/AQQQQAABBBBAAAEEEKgpAYKgmrrcNBYBBBBAAAEEEEAAAQQIgvgbQAABBBBAAAEEEEAAgZoSIAiqqctNYxFAAAEEEEAAAQQQQIAgiL8BBBBAAAEEEEAAAQQQqCmBNxYXF/+uqRbTWAQQQAABBBBAAAEEEKhpgTdN67dv317TCDQegRcVePjwIe+fF8XjOAQQQAABBBBAYJ0E6A63TvCcFgEEEEAAAQQQQAABBNZHgCBofdw5KwIIIIAAAggggAACCKyTAEHQOsFzWgQQQAABBBBAAAEEEFgfAYKg9XHnrAgggAACCCCAAAIIILBOAgRB6wTPaRFAAAEEEEAAAQQQQGB9BAiC1sedsyKAAAIIIIAAAggggMA6CRAErRM8p0UAAQQQQAABBBBAAIH1ESAIWh93zooAAggggAACCCCAAALrJEAQtE7wnBYBBBBAAAEEEEAAAQTWR4AgaH3cOSsCCCCAAAIIIIAAAgiskwBB0DrBc1oEEEAAAQQQQAABBBBYHwGCoPVx56wIIIAAAggggAACCCCwTgJvrtN5OS0C1S9w/6KSR8ZLa+fuc5oaTuhasluxR+zuVKfGNX7XKa5rVKmT9ZkVyz+e0t7Hh0PrzEa7vn/O2y9yTOZgSQvDSXUrXKa7PXd5QReT3dKVlHp35W6NW2POcXXrlIb2bYzbnGedOc9VJX4aUvtbeXYxq59N6tQn02qN7Lf6dhU4h9lkrutsa8R5WZMn92r643xt87anu12ruHX+uVfxt9O5Cv8iLWMzAggggAACNSPwxuLi4t/bt2/PbbC5ofhK6htu12puV3ILYg0C1Svw8OFDxb5/TJMjN8vmZny62bsJNoFJv/ryBAPmpn9arVek7pybbd8yUrZkbqj7pX/3SV/t1YATLDX2xdyYr+ImO/Z4vxr5Aq/4K+63K9WrbOgWv2fOWltfaTTvsV5A4bbblNHZd07p/gH5IWCm2BcPHLzALxyoNupcX0ID/eG1UqPOZQKy3LZ7dgl1/pbQoVI+Z3OueaY5uQs2IPTa3XllSolR87cRH0S6f5e5Bblrgr+x+HKyf4Pu9qxX/W5pwfxd2oCff1dcWZYRQAABBF69QP5M0FsJJe5O6w+JIOjVXxfOiMDqBJ79omm1qu+tjdo4nFK7f7QXbMUUtatXqVSvnz0ZUCKSTcjNnsQHGV7Jc0qORc4RZJycm/Fgj/FkNFgwWzr9AKfQeaTu6LH+DbV+7NfA+6NKDcsLIG2w5JVlMlVDisveBDUq9bcpr1vpvimNPt6bCWi9DFRao6mUNHxK6Q43CPDLvj+t8a5W9Qanejap/v6EbfM7JiD+8cM8AXFwwIv8DkylhffnNP2nJD+T5l7fd7Y2Kv1kWdpV7HHXRiUi5YRrlbt9+cerGneDHhPIjYaP4hUCCCCAAALrIZA/CFK9Wru6NX2/V/UldnVZjwZwTgSqScDenPoBxfgR07JxG2AUysaYvRZuDEgfT5X2wCImMJk7kozphtedCW5sNiGU2SigbjMWznb3JthZnV00wcW17MtSz+Nnq00Q0u90A+z9Ka1Twwsaap72uqfZz69eTT05pYv3h0ruuudUyC4u/9jvdHfzAp7JzUNK3PCCSJvdOnlY0ycntRzJ7CzMjquzOQiBFnTR77Znj9nXp9aTe3Vxi9tVLnr2l3td39yp7tkF9e7KzcFt/Ger9NUvWt5XPDtTqBxTw9jt7ydK+7t8uSZyNAIIIIAAAqsSKBAESdEnhO4NGl0aVuXMzgjIdI9KbC4O0XllVDqS7Q43tfWq+oMxO27GpavVK+z+RXWPSY19xcu2e7zVrqFUux0rlL9LXm53Pg0PZU8Q6p7md3kKsj8my/TCD042qt2eJ9uNKntSZ8meq11Dw966oZPe70w3w5Mmq1GvIacefzyek7Y4ZaxyceO+IR0eTiqZdA4c81+MhYPI8eSAMl3unk3q6piUaA7GLXlBU3Z8k2nzqC4mk7oYycg5Z3q5xc0JNf6W1rLpiPjjKfv3InUraceAhbP+XpaoU51j435g7HTrc8oxwmbfq+qUxsY1Z4Ldf4fPs9eORTOZwmxW6uUawtEIIHkwgjIAACAASURBVIAAAgisjUDBICj0hNDcaP12TlMp72mh+cevPF041qZhlIJAZQksK/1biTV6klZ6d0LvKJ1zQObGOpNtWdDFI2l1djXG7J1zeM6Kuf69SpoIK99PEGgF223wMy6ZICQVZBXq1ZtKqddsMxMlBMFQcMwL/fbLjBxrx9H0S+c6gnM7O/hdzA6ninXrco5Z5WL9yZRSfsAVHGo+C4OxXsE69/fyr2lpt1kTZIBSMRM8mPaaQOiUJr9NaODzuC6DpgwvM+iWb5YzfxfRDcHrtz5Uq/r1y7N2te8b0ujj8CQYOVn/sbQSP6WUesufMOOrSX1osltuOX7XurkxM1bLdDk0P8uh80zplPb+3KqpSGYsqBa/EUAAAQQQWC+BgkGQ3H/wTA3vDuja/XbbncTcDDjPhder/pwXgddE4A+l7ybUGje7md+ty0xCYn7G+wdkur9t3Cw1jnVrr8khRbM8Qbbl2aTU16dD6rfZIi9IiE4DEA503Bvmgt3sMoFWNoMxZ4OfoFtXhD4YZ2SDoensJAZ3B7Q3ORDZOfqyU8WGitgMRd6MwrImvxqQqV/fj6eUDGbDi57Gz9i4BtFd8r2Ot/X3jmSCgjI6vz2n9M8Jtb4vpWUCHfOpabr/uRMVLOjiybSdHMHbLrWb8VrRH3s9orPSRXfK93qjPvxY6v91We0xM/PldGPrOpwJ1EyPAGUC+JhyulqdiS5ituerEusRQAABBBBYR4HCQZCcga7mBueKlHTGDrzIjcQ6tpVTI7BuAnaAeNfh7MB4tyZ/pjX3fqsdN2EmIsm+r9xua+4BzvJb7erdZ6bB9taZLlupfdntme5hMTe+Zq+SM0FOF7pkMhpkZc9nlkxglXKzMasZE2Ru9AtOKz6eMzmCN/uZPyPe+1LUIKhdsYxNsF++3/nKdffPOcezSU3+X+1KzA68UKbOLftllzduSWhuNs9UN043t2LnKViOmUin0HmKFc52BBBAAAEEXpFAkSAoMtA1eNIbfPfIkYtqzTtl7StqAadBoNIFbDct6dxP2S5ctqvpJ9kMTeeV7JP/cedBQ9C0nEyQPx6jUDes4Nh8v8M39WYMTvHv4gkf430HUcFxRflOnm+98xkT2qVQFsRk0szMcN3TSs76R5n9RxNr3A2ryDiloMJBVsgP/szYn4WgXsE+6/F7V6s6j0xrwfluqUw1nKx/IrMyz0KhcswhzvZ38hTBagQQQAABBNZb4B9FK2D+Qfstrd9MFxMz65F/gHnaJztuoWgJ7IBADQukbTetxJXItMk2s5JSKuX9537ZqMkEBevN76m+xrX3M0HC8II3TsW+r01XLfMdQ6c0+cwLbk79uGwHvl+8v/anX9MSjWX0xt4EU91p7bVtLHQ20zUtqdLa6I1TMtdktEv+uKjwtTLrM9cv3zgYfzrzD+O6Rhaq6ktvMzN+ppV+FleQ140tbabRLvpTqBxzcLHtRU/ADggggAACCJRdoGgmSHpHCV3Vw396g2mzffvNjEG9TH1a9kvECV5vgYTah1OrakJpmSAz0UKjEh2rKtrfeVmTo+Pq7DbZJxMIBT/BzGzSwuM5JZo3qn6fmQo6qYt6iemb12hMUFDLkn+bQMiZHS72OBOQ3O3UYX+Wudh9YlbaCRJsICmlogFYzP7ZVd7YpUR3al0+O9/ZKl39dVlDzZ3SkW4lzWQ3frBmHmyNzy7In3MwW+WYpaCcwzHbzKpg+4d5ttvVZcnWFToh2xBAAAEEEMgKlBAEZW+MFDMzUrYolhBAIEdgLPtdOznbQiu8KYTNquyYIG8Hb1yP3zXV7SpnJimIZhNivgNIyna7M9N0nxtr1bTOqc8GCOYhR3fuxAWmK5c/C5q54a+3g/n9cTehepsXbvn+RncckLucc6xZEf2eoGAnsz57TrfLYLBH0d/mRjszxqhTo5GZ3WTGY3W1vtgkL36Q5U3YENQk5hzBJtuFca/z3UXOhnyLkev5QgZO2aY7ozehjf9luc42ZYLGlNywPdoF0hySLSe8b1Bcdnt4jFqw3f4251tl8Bk6nhcIIIAAAgi8hMAbi4uLf2/fvv0liuBQBGpX4OHDh+L9U7vXv2JbboOntA5X2phNsj8V+ydDxRBAAIFaEyg+JqjWRGgvAgggUBUCZia9Usc7lb/BJmOWzcqV/3ycAQEEEEAAgUICZIIK6bANgSICZIKKALEZAQQQQAABBBCoQAEyQRV4UagSAggggAACCCCAAAIIlE+AIKh8tpSMAAIIIIAAAggggAACFShAEFSBF4UqIYAAAggggAACCCCAQPkECILKZ0vJCCCAAAIIIIAAAgggUIECBEEVeFGoEgIIIIAAAggggAACCJRPgCCofLaUjAACCCCAAAIIIIAAAhUoQBBUgReFKiGAAAIIIIAAAggggED5BAiCymdLyQgggAACCCCAAAIIIFCBAgRBFXhRqBICCCCAAAIIIIAAAgiUT4AgqHy2lIwAAggggAACCCCAAAIVKEAQVIEXhSohgAACCCCAAAIIIIBA+QQIgspnS8kIIIAAAggggAACCCBQgQJvLC4u/l2B9aJKCCCAAAIIIIAAAggggEBZBN40pb639d2yFE6hCFS7wO+Pn/L+qfaLTPsQQAABBBBAoOoE6A5XdZeUBiGAAAIIIIAAAggggEAhAYKgQjpsQwABBBBAAAEEEEAAgaoTIAiquktKgxBAAAEEEEAAAQQQQKCQAEFQIR22IYAAAggggAACCCCAQNUJEARV3SWlQQgggAACCCCAAAIIIFBIgCCokA7bEEAAAQQQQAABBBBAoOoECIKq7pLSIAQQQAABBBBAAAEEECgkQBBUSIdtCCCAAAIIIIAAAgggUHUCBEFVd0lpEAIIIIAAAggggAACCBQSIAgqpMM2BBBAAAEEEEAAAQQQqDoBgqCqu6Q0CAEEEEAAAQQQQAABBAoJEAQV0mEbAggggAACCCCAAAIIVJ3Am1XXIhqEQKUIPBhR0/GJ0mrTcFqTg3W63nJCN+KOaDigDk3oxryz8eB3utOzLbNi5daXal/qDK0zG+368/6BkWMyB0taHNmjowqX6W4PLz/S5ZZZtcz0aIfc5fBeua/MviekS7d1bGfu1vg15phx1f3wtT7dFL+HXfv8ls7sv6PmyH6ra1eB8tmEAAIIIIAAAlUjkD8IMjcU30pnB9u0IdPcFd08c0DfODdiHau6mckUxAICtSHgBB3mZnym0bv5N4HJeZ3WYFv23WVAjs3c1rEgqLgkHZ1rdoKaHh0L1EyANRe8ML9XdPd/0hefv62bZ/aE3qMfnJ3QnZnweZQ3QDuhputuuZI5PlrP8B6rebVNB882qH3ukY7tzAZwhUvYpmOXtqhp/4i22qArbu8V3fz2gu5Jurd/j77xd+k4e1pLtj3hdvG5FWfIOgQQQAABBGpHIH8QtKlOdfOz+lPygyA/AHrvO90ZDG5ezBPaPbpMIFQ7fzG0tDIFns9rVk06u2mDNgze1qd+Lb1gK6bKO3t0Z6ZHstmTC6qLvIdzsydeBiecpTqglkzREzra4ma9Duj7mX/pceShSWZ3zecEW7IBowniwg9asscocg5JNoPWJt26oG/sZ5OcDJX3mWWyToMyQaMbULqlsowAAggggAACtSaQPwjSNrUcPKGZBz3aYbut/KWleanjUBAAGaoXeapba8S0F4HSBWzw4Wdibhw3x03YYKFYNmbxvxekjyacrG2Bc/qBj8maBD/3ju+J6YaXzZ7YzInNUgVHmKBoNnghyQQ9pmuc+7Oix2rQF5Huae4emeVQZqvEY/xstQnkzjvdAI/9sKQzI4802Dir2Y8mNGg/v3o0+fRLXX7w9Sq64WVqxwICCCCAAAIIVJlAgSBI2lzXoKWnK9JO05XmbdU1SN9EurFsaPtad6oMheYgUB6BBtW9XbzkjkvfScdn1eJ3h5usG9f5YMyO21XtYLNX2IMRHb1uuq0VL9vusalNgzNtdqxQXJe8TCk2MHmZ7MkGfTr4daY4rwue/GDJzywF3QVNZsofI+QdE5d5yhblZY3aNDjorRvs8X5nuhn2mM+sbX4A5G370zzFedcpg0UEEEAAAQQQqFmBgkHQhmST9O28VtrMuKAN+vTz05rdn306XOzpdM2q0nAEcgRW9Pj3nJXxK54uaamhTpu1lLM9M5Ylkzl5pMvHn6jjYEPM3jmH56y4d/6AmkyEle8nCLSUOx7QZH/ydofzu6nZkUjB+CMT8MwEmeRt3vgns81MlBAEQ5l6+Nszr70Fb5IH6YvPgnKcHUxG6PwWdUXHPzm7sIgAAggggAACCBiBgkGQNjWoWRd093mbNyuT/wTZHOjdjHg3UJkbM0wRQCCPgOlOukUtcbObOZOQmINvnL9gJyPY8Lb0wfUTaldMlifInDy/JZ09rYO6YLNF3vvSmbnE1iYc6Ljv14IPMjKBlinEZHWyY43kT96QbWxMd7ig250NfvxUTfYAbykYm2SDodmYLnXZA7yugjHnsbv4EyMc/E5nb32ppmA2vOzh3tJ1r9ufaxDdhdcIIIAAAgggUP0ChYMgbdDW9+Y185ekyM2b7QbX5gdDx0f8qXKrH4wWIvAiAiu3xnXjYGd2dje3kL+WdO+9Zjuex0xEkr1Bd7utuQc4y5vadMy+D711wfsy2CPTPSwyC12wvfRMUHDEKn473e6aWqKBWbgcE4zZGeyCrFF4s/MqOgGD8ZpQ3TV/MoX3pKhBcLA7O1+wjt8IIIAAAgggUJsCRYIgaUfjAR0144DM3FPX6jQZmjJb2vDultqUo9UIlCpgu2lJX/yQ7cJlu5ruz2ZoOi5lMyU3YiYpiBvv87I39eFgwYzBKeG7eEpts7Nf+Dzeg5O8Y5GCzJBzvF20Wak845NMxsnMDHdoNjttuNk/5vMqWiyvEUAAAQQQQKA2BYoGQdrZrI5rS1rpaVbH/Am1j9Q531uyopvXJmx//vCsULWJSasRyBVYst9fY6agDn3Rp9O1NHpMNhPkbfGyOdG9XvJ1JqiQLp9Z0sHBNh2bOa2bZ77Uzc+/1u6U9z1GXUsHvO82MlNM53zxa4ExQaGM1kvWtdjhxtLEkA+c2epMMHVoRE0jj5zPq2IFsR0BBBBAAAEEakWgeBBkZoXTuB0XdGxmQnVnDqgpOxrajl24k6erTa0g0k4E8gvU2bE0+bfnbiktE2QmWmhQ3We5xxdf4z286DhkIodHzu7Z2dwWl+ZV17hBO9puSyN7dLnxtve9Qpm9S5kiO7Pz+iwE46bW5+ycFQEEEEAAAQQqWKCEICh7Y5Q7OLqCW0bVEKgEgevZ2RQLV8cb8G/2yZcJsl1T3a5yZsKByFi94MtP3e8AMrO4ZWeAa9AX/3eTZnVaZ+2U1OYhxwm1t1wIV8/M7ub30NvRczvy/T/hXfO/iptRLtjbrZO/zp1Rzq4KH+92GQxKKfo7NMbogL7P9joseig7IIAAAggggED1CryxuLj493tb+fKM6r3EtKycAr8/fireP+UUpmwEEEAAAQQQQGDtBf6x9kVSIgIIIIAAAggggAACCCBQuQIEQZV7bagZAggggAACCCCAAAIIlEGAIKgMqBSJAAIIIIAAAggggAAClStAEFS514aaIYAAAggggAACCCCAQBkECILKgEqRCCCAAAIIIIAAAgggULkCBEGVe22oGQIIIIAAAggggAACCJRBgCCoDKgUiQACCCCAAAIIIIAAApUrQBBUudeGmiGAAAIIIIAAAggggEAZBAiCyoBKkQgggAACCCCAAAIIIFC5AgRBlXttqBkCCCCAAAIIIIAAAgiUQYAgqAyoFIkAAggggAACCCCAAAKVK0AQVLnXhpohgAACCCCAAAIIIIBAGQQIgsqASpEIIIAAAggggAACCCBQuQIEQZV7bagZAggggAACCCCAAAIIlEHgjcXFxb/LUC5FIoAAAggggAACCCCAAAIVKfCmqdX27dsrsnJUCoFKF3j48CHvn0q/SNQPAQQQQAABBBCICNAdLgLCSwQQQAABBBBAAAEEEKhuAYKg6r6+tA4BBBBAAAEEEEAAAQQiAgRBERBeIoAAAggggAACCCCAQHULEARV9/WldQgggAACCCCAAAIIIBARIAiKgPASAQQQQAABBBBAAAEEqluAIKi6ry+tQwABBBBAAAEEEEAAgYgAQVAEhJcIIIAAAggggAACCCBQ3QIEQdV9fWkdAggggAACCCCAAAIIRAQIgiIgvEQAAQQQQAABBBBAAIHqFiAIqu7rS+sQQAABBBBAAAEEEEAgIkAQFAHhJQIIIIAAAggggAACCFS3AEFQdV9fWocAAggggAACCCCAAAIRgTcjr3mJAAJrJXD/opJHxksrbfc5TQ0ndC3ZrdgjdneqU+Mav+sU1zWq1Mn6zIrlH09p7+PDoXVmo13fP+ftFzkmc7CkheGkuhUuM7z9lNIdQ2rXpE59JfUNt+uP4aSmm1Pq3Zxdt9E9KGd5QReTV5X4aUjtb+VsfLkVxnu2NdL+ZU2e3Kvpj6c0tC+uZt72dHdKvbuC08et87et4pp2XnHLDMrmNwIIIIAAAghUgsAbi4uLf2/fvj23Ls+K3dQUu7nILZI1CFSbwMOHDxX7/jENjdyUmyDDBgy7vMCkX315bsxNoDCt1itSd85NvS8YKVsy78d+6d990ld7NeAES419MQHAKm7ms8f79fopoatfSa3vDyhtAiATPNy/qFNPDuVpT+Sq23NLo6leZUO4yD6rfmnqFg0gG3WuL6GB/mhY2ahzmSDMb5NTFy+YTKjzt4QODbcrLnQKVS/nWoS2hl+Yz9VPBmRC0kyQ5KyTDYYLndP73A2ub+baOGVkyg2fmVcIIIAAAggg4AjkzwS9lVDi7rT+kIrfBDgFsogAAusg8OwXTatVfW9t1MbhlNr9Kpgb+v646uzqVSrVK/k3z4lI1iI3K5QNMsY/8QqcM4HWWFK6klLr7LjmxsaVzJzMBBq5AZlble5kJDgpGgC4R7vLJjDoVrpvSqOP92YCTa9taY2mUtKwn8WKZp/uT2u8q1W9QXHPJtXfn7AB2jvG7scPSwvsguNL+t3pBIDLmvxqQOqbUmqfbNaq0DkXhvdqQOc0lTKBkhcQXdxiAtF2DaU+tMenS6oDOyGAAAIIIFDbAvmDINWrtatb0/d7VZ/pJlLbWLQegXIL2OBjzDvL+BHze1zJMSnzxD9PBRZuDEgfT5X2wMLJGgTFzR1JxnTD67bnNvvY7EIqpV75wVAoYFnQxdHgxtzrVjfdbLq7LWtSbtYlOFvMb1Onr2LWl7Bq+cd+p7ubF/BMbh5S4saATHBns00nD2v65KSWI5mdhdlxdTYHIdCCLn4yrdafhrxj9vWp9eReeUFGCRV5kV1M8Hq3Ua3/9vJN7d2dGhj9Rcv74rJBC5oeM9ci2LZRZv/k7IJ6d61dTu1FmsExCCCAAAIIvG4CBYIg6Z2tjUo/WZZ2+R1C3JsnO0bhdWsu9UVgPQUaldhc/PydV0alI9nucFNbr9psjhsg2VK6Wr3C7l9Utw2Uipdt93jLZA3a7Vih/F3ycrvzBVkjdXWqcWxAe5PTtlvZh79Oy2QfslnjoJ0b1T48ZEYbxXRVc+pqxym1a2jYWbeKxY37hnR4OKlk0jnIZKjMz1g4uBtPDoS6oV0dkxLNCmXEsmOVTP1HdTGZ1MVIpsw508st/pnWnBI67Gao7qYdyxKK/y2tZdWXFgCXUBy7IIAAAgggUAsCBYOgjf9slb4Knkq63TY2euMdjkiNH9cCE21E4GUFlpX+rcQynqSV3p3QOza0CB+TGe9hx6GYbQu6eCStzq7GmL3Dx8a9muvf63Rhi9kjCLTsAxCTJTFd7SZ16rdgIoekBnaf0+jH05q+L9XvMtmKhFpPumXVq9dmkdx1wYQN0rmOl89i1J9MKRU6Z5CRyj85wfKvaWm3qVOQAUrFTNZg6m4CoVOa/Dahgc8jXfgyTfIydpmX/kLmekU3uK/ttfZXbE4o/5V8R4nd0sDopD9WaVmTo+PS3c7VBU3uuVlGAAEEEECgRgUKBkF660O1ql+/PGtXu8LdNrTrkM7tHtd0jcLRbARWJ/CH0ncTanWf+AcF+F3BzGxr5me8f8B2f9u4WWoc69Zeme5wwc7+bzOmx3RTfTYp9fXpkPpttig0E1zmkHCg496YF+xmlwm0JPnZo2CczeFUr808ZIKb+2ldNVljRcbYZOoQXvCyWu7YmPD21byKb7NfQiQTFJTb+e05pX9OqPV9KS0T6JiMVTC5RDBz3YIunkzbgMPbLrWbcVTRn9VMjBA9dlWvvcxUOtmtvckB81ehc32dkjMJxqqKY2cEEEAAAQRqWKBwEKSNSrw/p+k/jVC024bZVsNyNB2BVQgs/3hV412HswPw3WNNl6j3W21QYbqUZYMUt9uae4Cz/Fa7eveZrIq3znQNMwPsgx9vYoR8s9BJq8sEebOambLngkkNgrFBu1qVOHJNF7ucMTYmOCg4Rfi4opMjZNsetKD472ib444wQVcwM5/d/mxSk/9XuxKzAy+UQYs7xwuvc7u/2e5x0uHo1OYKAsZwVs1cX+1u1TsvfHIORAABBBBAoDYFigRBUn1zp7rNwNsO001jWulnUr19mu1379lam3C0GoGSBeyMY9K5n7LdvmxX00+yGZrOK9kMw3jMJAU5mSD/e31CN/YlV8jbMRw8mHE7Bb6/x2SCrqSVHE1oyp9cwAuwPvTHotTrUN9V7f35nKaCbmnBDHTReq155qTImKPg/EFWyA/czNifhdlg4zr9juv+5nePC1+f+Pr98XhOev8w44HieViLAAIIIIBAXoF/5N0SbNjVqk4z8NZ0jds9p4EbC94WO6tRsBO/EUAgXiBtp0BOXAm6WPl72e5lKaVS3n/ZL+r0MkHBevN7qq8xvuiXWWsCkWHzXjZdvibtwPrelJnS+pQmn3njdU79uGy/QPXife9EC2pVqjutvUkzCUHSfjFr5gtIbaA3J90d0DV//5epntc1Lang3IXL8rIjxmq0S5KZaMF3DX6b9SbLZF9HZojLlO1PM/5hXJfFzE5rvGA/V8d19UfTldAb49P4cRBY5p7LZLTMdbE/dkKMxjUZU5V7JtYggAACCCBQ3QLFgyC9o4Sm9cszrz9651i3vQFKfpJWwtxw8IMAAgUEEmofzj84P+5AkwkyQUbw395+89Wa0R+TiQ1mYYtuK/bau9nubM5mprwjvNncTIbEZBgSWzbKTDjQOusFI/W76mWmlDY/nX3n7Hgle0NuAqpPvOmoUz+dU/pIqcFLgXrahyydal3l9Px2goTmaT/AK1B+ziZv4pdEdzD9dM4OZVqxUe3/PieZCSqS3ncA9e3L//Ws9SdHlbD7Jm1Xw85ocJ2ppRnftAbXIVMeCwgggAACCFSXQNHucOarUr1pbk3Dw/3RFT/CobqEaA0CLyNgHhr43/tTuBhvzIfZJzouxut25ndNdbvKmYxHNGvhTmOfOWG2250dTD/WqmmdU58NMMxDjmCgfeYAyXQZ87u1mcCi3pRrBuObL/VM+Tfp+7xptpNHzJeL+t/HIzOOKeHNpvaTm/3yvthzwB/E73b/c86aXTRjY7paZaYrWPWPP2lEeErxTo0G3fRiCjRfQjr98ZSGSg26Is5F2xNzzsyqYNKJzIpCC9HP4Hz7ms/tVL6NrEcAAQQQQKDmBd5YXFz8e/v27TUPAQACLyLw8OFD8f55EbkaPcYGT2mZ2fWiebiXF/ECzXT36jKPL39eSkAAAQQQQOD1EyihO9zr1yhqjAACCFSugJkVb427qtlM3V4FmbbKbTs1QwABBBBAoDIEyARVxnWgFq+pAJmg1/TCUW0EEEAAAQQQqGkBMkE1fflpPAIIIIAAAggggAACtSdAEFR715wWI4AAAggggAACCCBQ0wIEQTV9+Wk8AggggAACCCCAAAK1J0AQVHvXnBYjgAACCCCAAAIIIFDTAgRBNX35aTwCCCCAAAIIIIAAArUnQBBUe9ecFiOAAAIIIIAAAgggUNMCBEE1fflpPAIIIIAAAggggAACtSdAEFR715wWI4AAAggggAACCCBQ0wIEQTV9+Wk8AggggAACCCCAAAK1J0AQVHvXnBYjgAACCCCAAAIIIFDTAgRBNX35aTwCCCCAAAIIIIAAArUnQBBUe9ecFiOAAAIIIIAAAgggUNMCbywuLv5d0wI0HgEEEEAAAQQQQAABBGpK4E3T2ve2vltTjaaxCKyVwO+Pn/L+WStMykEAAQQQQAABBF6RAN3hXhE0p0EAAQQQQAABBBBAAIHKECAIqozrQC0QQAABBBBAAAEEEEDgFQkQBL0iaE6DAAIIIIAAAggggAAClSFAEFQZ14FaIIAAAggggAACCCCAwCsSIAh6RdCcBgEEEEAAAQQQQAABBCpDgCCoMq4DtUAAAQQQQAABBBBAAIFXJEAQ9IqgOQ0CCCCAAAIIIIAAAghUhgBBUGVcB2qBAAIIIIAAAggggAACr0iAIOgVQXMaBBBAAAEEEEAAAQQQqAwBgqDKuA7UAgEEEEAAAQQQQAABBF6RAEHQK4LmNAgggAACCCCAAAIIIFAZAgRBlXEdqAUCCCCAAAIIIIAAAgi8IoE3X9F5OA0CtSfwYERNxydKa3fDaU0O1ul6ywndiDui4YA6NKEb887Gg9/pTs+2zIqVW1+qfakztM5stOvP+wdGjskcLGlxZI+OKlymuz28/EiXW2bVMtOjHXKXw3stjnypx599rU91S2e+lc4OtunPkT2aabytY29n120IHxZ5ZcofV90PX+vTTZFNvEQAAQQQQAABBF5AIH8Q9Dx6g2JuRGJu0OzNW5sK38S8QM04BIFqEHCCDhNk2Jv/nV5gcl6nNdgWfuccm7mtY0FQcUk6OtfsBDU9OhaYmABrLnhhfq/o7v+kLz5/WzfP/FqfrgAAIABJREFU7NE3TrD0wdkJ3ZkJn0d5A7QTarruliuZ46P1DO+R/9WOnk7NtIxo8Yc6u9PdkT1aMgHQTkkPlqSP/lXCZ8c2Hbu0RU37R7TVBl35z8cWBBBAAAEEEECgFIH8QdCmOtXNz+pPKXST0nHJv4Gxpa/o5pkDaj8jTQ4SCJUCzj4IlEXg+bxm1aSzmzZow+BtfeqfxGSBzsedcGeP7sz0SOZhx/4Lqgu9r+OyQnEPQQ6oJVP2hI62uFmvA/p+plkz/oOTG/u9He+Z4Oz6HunSbbXMTeje9Qk1ZSrYoC9+OC19eyAUxGVOIUXOIYmHMC4PywgggAACCCBQokD+IEjb1HLwhGYe9GiHeWob+7NBnw5+p6WWE7r+oM17uhu7HysRQKAUAdslzc/E3DhujpiwmZli2ZjF/16QPpoIPbDIez4/8Lnn7HDv+J6YbnjZrJB9+GGzVMFBXhe44JVkgh7TNS78syOT2TqhG6GA5ZEuXzutyRnv4YmXJTPd3VZ0UyYYKqHrm5+tDp+RVwgggAACCCCAQHGBAkGQtLmuQUtPV6Sdka40oXLfVl2DNFt0v9BBvECgBgUaVPd28WZ3XPpOOj6rFr873GTduM3muAGSLeVgs1fYgxEdvW66rRUv2+6xqU2DM212rFBcl7xMKbbLndsdL7Ol9AU/4NLBA/rg+gW1t9yxAc7u1KyWJCfTHNiYBytfS7ZLYEz32+DMtpthmwYHgxX8RgABBBBAAAEEShcoGARtSDZJ385rpa1QV7cN2vqe9M3SX5GOc6VXgj0RqH6BFT3+vcRWPl3SUkOdNtswIXxMpjtqZkzQI10+/kQdBxti9g4fG/fq3vkDTne0mD2CQEte11d3rJHJ/uTtDmeyPp9L5/ffUfMPpnveLZ35PZj8YY++aTit7z+6o5kH0o6djzRzfYtaetzzb5M3PspdF0zyIH3xWXZCiPAevEIAAQQQQAABBIoLFAyCtKlBzbqgu8/bmJWpuCV7IFBA4C8tzW9RS9zsZn63LjNzmvm5cf6CnYxgw9vSB9dPqF0xWR4zpsd0U31+Szp7Wgd1wWaLQjPBZWoTDnQygZQtt8CkB5lAyxRkMjTZsUZepmY2c4Z83eFMxskbd7Skrpke210vE9w8WNKYySBrVjcONmcnfXBKdRe9TFh8tzt3P5YRQAABBBBAAIFiAoWDIJksz7xmTJIn7ubNlu494f7goxL6+RSrDdsRqFKBlVvjunGwM/5G/68l3Xuv2QYIZiKSbJDidlvLA7OpTcfaTIbE276h7Wvd8WIpu8KbGCF3FrqgtNIzQcERq/jtd4ULxh7dCyZOCMYG7WxW3fH/6PLBCXU0+mmgvLPWBeeNTsDgegX78BsBBBBAAAEEECgsUCQIknY0HtDRuUf5Jz0ws1LNS3WHCo0bKlwJtiJQ1QLPb+n8eemLH7JduGxX0/3ZDE3HpWxfsBsxkxTEjffxJhNwZ2tcnWI4YCrDd/GYsUeXltR0rS4ze6QXlDX4Ezhs08Gz42r/32lNBs0PZq2LNmUtxidFy+Q1AggggAACCNSsQNEgSDub1XFtSSvyvucjLLWim99e0L2G0zqbdwa58BG8QqC2BJbse8RMQR36ok9/coI4i2wmyNuad5rruINLXZcJKqTLZ5Z0cLBNx2ZO6+aZL3Xz86+1O2Wm1j6trqUD3ncbKe6LXwuMCfIzWi1q1p1Ds2pq2ePVzE5o4D8wscGhmTN7ntklS71u7IcAAggggAACayJQPAjS26rTuO4+94KgnKfUzpdBrkmNKASBqhKos2NpVtOknPdY3JggmW6oDar7bDUlB/uu6Oa1CXUcMumXR8FKf9yPmZlNWlyaV13jBu1ouy2N7NHlxtve9wpl9i5timxpmxZHTtijOs6e1tL5EzpTN6HBd/+jpuMTtuvf4Nvmu4r26HLku4oyp2IBAQQQQAABBBBYY4ESgqBgylpJoe8JWeOaUBwC1ShwPftdO4Wb5w34N/vkywTZrqluVznzACI6Vi8yDsc7Z7bbncx38PzfTZpVkL01DzlOqL3lQrh6ZtyO30VtR8/tnO//Ce+c51UwPfbZCd2Z8bM/bd7U3E3Ht+j7maBcM/apTpdbvtTN0PcDhWekc7sM5jkjqxFAAAEEEEAAgZIE3lhcXPz7va3vlrQzOyGAQFjg98dPxfsnbMIrBBBAAAEEEECg0gX+UekVpH4IIIAAAggggAACCCCAwFoKEAStpSZlIYAAAggggAACCCCAQMULEARV/CWigggggAACCCCAAAIIILCWAgRBa6lJWQgggAACCCCAAAIIIFDxAgRBFX+JqCACCCCAAAIIIIAAAgispQBB0FpqUhYCCCCAAAIIIIAAAghUvABBUMVfIiqIAAIIIIAAAggggAACaylAELSWmpSFAAIIIIAAAggggAACFS9AEFTxl4gKIoAAAggggAACCCCAwFoKEAStpSZlIYAAAggggAACCCCAQMULEARV/CWigggggAACCCCAAAIIILCWAgRBa6lJWQgggAACCCCAAAIIIFDxAgRBFX+JqCACCCCAAAIIIIAAAgispQBB0FpqUhYCCCCAAAIIIIAAAghUvMAbi4uLf1d8LakgAggggAACCCCAAAIIILBGAm+acrZv375GxVEMArUl8PDhQ94/tXXJaS0CCCCAAAIIVIEA3eGq4CLSBAQQQAABBBBAAAEEEChdgCCodCv2RAABBBBAAAEEEEAAgSoQIAiqgotIExBAAAEEEEAAAQQQQKB0AYKg0q3YEwEEEEAAAQQQQAABBKpAgCCoCi4iTUAAAQQQQAABBBBAAIHSBQiCSrdiTwQQQAABBBBAAAEEEKgCAYKgKriINAEBBBBAAAEEEEAAAQRKFyAIKt2KPRFAAAEEEEAAAQQQQKAKBAiCquAi0gQEEEAAAQQQQAABBBAoXYAgqHQr9kQAAQQQQAABBBBAAIEqECAIqoKLSBMQQAABBBBAAAEEEECgdAGCoNKt2BMBBBBAAAEEEEAAAQSqQODNKmgDTUCgMgXuX1TyyHhpddt9TlPDCV1Ldiv2iN2d6tS4xu86xXWNKnWy3lkRLC7oYvKqEj8Nqf2tYF3M72eTOvXJtFoj+y0MJ9WtfGWHy1n+8ZT61aehfRvDG+yrZU2e3KsBt84xe2VWOe0xdZhuTql3V2arXci3PrwXrxBAAAEEEEAAgcICbywuLv69ffv23L3MDdJXUt9wu6K3N+bGZ2+/dC5y85RbCGsQqG6Bhw8fKvb9Y5ptgqDZ1kyg4t7AFw4eTBAzrdYrUrdzfEgyUnZoW3DuI9JoqldxYZIUH6B09p1Tun9Ac5ECO6+YgMTUK0+Q5u5vA7ro54bfplB94taZgkzd+qV/R4K4Ap9J7ulZRgABBBBAAAEEignkzwS9lVDi7rT+kCJB0LJ++Vnq7JKmf11We+wT4GKnZTsCCKyNQHwwE5TdnYzklfwART/2a+D9UaWG5QVcNjjxytKVlIYUDuCC8qTOUGCVE8z5gUp2/xddSigRyWIt3JhW67+H7OfRarJVL1oDjkMAAQQQQACB6hXIHwSpXq1d3Zq+36t6t0vK/WsaUKummtPae+SaFvble9JcvWi0DIFyCdib+zGv9PEj5ve4kmNSY99Uni5nZp/G0rKyQYDybFL9jw9nMlS9P6V1anhBQ83Tmv54SkP2/d6rqSendPH+UKRL2rhyAivtVbLfEdl9znmxukUvy+znofwAzmahNk9qemufev3AqP7klM6d7Nfks0i2aHWnY28EEEAAAQQQqFGBAkGQ9M7WRqWfLEu7sh3iFmbH1fjxlDbuSqhTMUFSjULSbASKCzQqsbn4Xp1XRqUj2e5wU1uvysQYboBkS+lqtXna9uEhs7VwVzU73qZdQ8Pe+YdOer8zmZyT5j1e7wdA3rY/Hs9JW7zl7P/LmwnauG9IqX9O6tSNhIZO1ts2T5vW/ZqWfh4IB1umUl9N6sOYLrvZ+rKEAAIIIIAAAgjkChQMgjb+s1X66hct7wv69y9oeqxRrT+ZG6aNOtTXqL2zC+rdFT/qIPd0rEGgVgWWlf6txLY/SSu9O6F3lM45wBubE4w3cjfXqzeVUq+7yoyuCcbvdcS8R01GqD+hw6nsQ47I4ZGX5hwx5bh7vZUNtOyYqMjEEOPR7nkm1+WsM+079GRa2trnl9qoxJOL6u4fl0xXvlTwWWQ2e933rt1vj2Sr3AqxjAACCCCAAAII5AoUDIL01odqVb9+edbuzTJ1f1rjXYeV8rukmCCpsX9aCyfr8wy+zj0haxCoTYE/lL6bUGtknIu1cAb8m9fj/QO2+9vGzVLjWLf2mg5vQUwQ4O3qVcrtphqsd357maNw5ia7eVmTXw1ormtUfT+eUrI/OhWCv+dY0s5W5wUnZkKUuP0i3eEkecFar1KpICyLmwQhbp20MCu1dpjAzDx0Sag11avUvqCcbAvMg5j24ZS7gmUEEEAAAQQQQKAkgcJBkDYq8f6cpv+U9NayJkfHpbveGIVQ6T8eKjBeIbQnLxCoSYHlH6/aBwhxt/L6M62591vtgH8zEUkm26N2DaXabTbHHXITAiw6DXfuGJ7OK1NKjPpTV78v2S5o+0Kl2hcmiHKnqV5+kjs2KdOdzpkgxay7llucZLNbcRvcdSbwmZOaJf1pHrq0qjfPTHbmqMJjpdxyWUYAAQQQQAABBLICRYIgqb65U92my9vmtKbv5j5Vtt1tfna7zGULZwkBBCTZbmdmSvlsVzLb1fSTbAal80o2PBo/4mVfXLucTJA/RsgEKdlsi3NEoSm0TebJzAzXPa3krH+M2X80oaki42vm+rN1zp4td13nlexWu2SyyO+bgKbYj+lyN6XJk0kl75qA0ByxHDv5gxeAFSuP7QgggAACCCCAQK5A0SBIu1rVOZrWb79Oa67rsMwQbPcn6BKX6TLnbmQZgZoXSNtuZ4krqfAXl5qxM6n2WJ1sJsjbvOY3++bcZmKE+2bKAf/HdK/rvqjk8EJm1rhgk/s7mnnx6hb+slSzLpwJ8rLInd3FQyDvXBv14ceN0t05jY9O6tDwh24VWEYAAQQQQAABBF5aoHgQpHeU0EVd7F9Q55VoCGS6yX2o1t0DGrixoPbYb69/6TpSAAKvsUBi1eNWSssEmYkWGpXoWEOaIuOMTLe5mE+AnAqY/bLhjv89RibzVGQMU1CQCaL2/tyqqdSQZJaHpXOa08AnSQ0EO/m/4zJkkV14iQACCCCAAAII5AiUEASZwcejin9mbcrzBifn355zTlYgUDsCY932e36KN9jramr2y5cJsl1T3a5yZtrr0EQL4S9OdbvYFT+/v0dojFGnRv2ptEs+PrSjN223+fLVUgMgM6PcXvMdRsN+10EzZbYdE5T7XUhrniEL1Z0XCCCAAAIIIFDNAm8sLi7+vX379mpuI21DoGwCDx8+FO+fsvFSMAIIIIAAAgggUBaBf5SlVApFAAEEEEAAAQQQQAABBCpUgCCoQi8M1UIAAQQQQAABBBBAAIHyCBAElceVUhFAAAEEEEAAAQQQQKBCBQiCKvTCUC0EEEAAAQQQQAABBBAojwBBUHlcKRUBBBBAAAEEEEAAAQQqVIAgqEIvDNVCAAEEEEAAAQQQQACB8ggQBJXHlVIRQAABBBBAAAEEEECgQgUIgir0wlAtBBBAAAEEEEAAAQQQKI8AQVB5XCkVAQQQQAABBBBAAAEEKlSAIKhCLwzVQgABBBBAAAEEEEAAgfIIEASVx5VSEUAAAQQQQAABBBBAoEIFCIIq9MJQLQQQQAABBBBAAAEEECiPAEFQeVwpFQEEEEAAAQQQQAABBCpUgCCoQi8M1UIAAQQQQAABBBBAAIHyCLyxuLj4d3mKplQEEEAAAQQQQAABBBBAoPIE3jRVem/ru5VXM2qEwGsg8Pvjp7x/XoPrRBURQAABBBBAAAFXgO5wrgbLCCCAAAIIIIAAAgggUPUCBEFVf4lpIAIIIIAAAggggAACCLgCBEGuBssIIIAAAggggAACCCBQ9QIEQVV/iWkgAggggAACCCCAAAIIuAIEQa4GywgggAACCCCAAAIIIFD1AgRBVX+JaSACCCCAAAIIIIAAAgi4AgRBrgbLCCCAAAIIIIAAAgggUPUCBEFVf4lpIAIIIIAAAggggAACCLgCBEGuBssIIIAAAggggAACCCBQ9QIEQVV/iWkgAggggAACCCCAAAIIuAIEQa4GywgggAACCCCAAAIIIFD1AgRBVX+JaSACCCCAAAIIIIAAAgi4Am+6L1hGAIE1FHgwoqbjE6UV2HBak4N1ut5yQjfijmg4oA5N6Ma8s/Hgd7rTs81ZESw+0uWWcdX98LU+3RSsi/n9/JbO7L+j5sh+iyN7dFT5yg6Xs3LrS53XaQ22bQhvcF8Zh2t1mhxsk7tXScf65axmX/fURZdN3eaa8zjGHb2im2cO6Bv3OsTtZq+n094S/hY6Lt3WsZ0xheXxi9nTWeXVc+lQnjKdPc31nml09zPHXpA+L+Hv5791GuyRLuf5u/3g7EThvw2nHnGL5rq3ny+C7VqX4Jw5z0u85+x75HqmpNBC6DpG/r5eqbV5f38rnY287xZHvtTjz2Kurf08WFLXTI92OC3KrbOzMc/f5mrer6vZ1ztzhX2+ORwsIoDA6yWQPwiKfoDaD8gLuhfTvtCHfsx2ViFQswJOoOLeTOT7h//YzG0dk/lHflYtl6SjoRv0Hh0LIO3NVfAi+nubjl3aoqb9I9oauaHJ7rmim9967+d7+/foG39Dx9nTWrI3dyfU5Nzkee9xU6+4IO2Ams5nS5Z7U6oV3bz2RF983hMKgJy9w4sFPmekyHnskQ36IhLEhQss/Grl6RN9UPd24Z1ytobPmXMt/c/OnMOcv4XoNvu3EazMY9DeciHYI+d3zmfw83nNzh9Q12DOrsVXPPiPvpmfl5y/i9xg5pEu7zc3zG22PO/vtnjRL7JHTttChTzS5TNLoTVynMv1ntvRc1t3eiRT/lhdNNDz379533tOdctpvalNXe/tUftIXSbIN3+rR9WpOzEPR1ZSd6Szp0MBkJ7f0tjvp3W2x6lzZnG93tuV9PmWwWABAQReQ4H8QdCmOtXNz+pPybt52dSmQf8fvEw77VM3qSXu6WVmJxYQQKB8AoUzE0dbIpkoP0DRrQv65r3vdGfQPMWfVYu9YfPK0qXbGlS+DMkBfe/c3BUNAMxN3nvBTVdcEOUGNl5wkfM5IynnPGsE+ufSvOoa3fyUd65o9iEcBMzrGydA8KritkMygWDOz/VwYBnd3tHor3E/a/2AKvo0P3qsbOCcG6Dei15/58COr05r6d/+g63re7RkszZ/6bIJvGeCu15zzcZVl3SMbJDmZRDdjIFTdG0sZgKEDVIk45MD4Aa25bR2z5OpRPTvbt55wGHec6elb4PsZvB37L3PN6fu6N78vEIBeBBkvpL3doV/vmWMWUAAgddRIH8QpG1qOXhCMw96tCMuyDEftscnZJ7S1fQ/hK/jVafOFStgniwf9TMwN46bak7YG5bwTXi0+uHMRHRr5rV5z34rmae755c6M0+Hj/2wpDMjjzTYOKvZjyY0aN/vPZp8+qUuP/g60kVrQjmBVTRDkwkAHunycen7mW32nGds5sBkuryf/IFNvhuf4AYtaFE4IAvWlvLbnDsT6Fzf43dB9G/8JPu5FnRN8+rplhr2zmlH4OweYpaDm8foenkZhZm49f+9IH10Wtdbgjrm7uT9bWxTNhvjBy6lZMhm2mw2w+sOZ9xn1WL6t9kf8zrarTLIAH2tHUHG0gmKc2tX+Wte7D1nHLxA0IaHO3v0/dweXX7gdit02u4HttnMVJms3QDaOX3hxRXdlPs3ber2H5nA+vr5Lfp+xlxr/yeTgX6V7223bkFFYn4H77tX9vkWUwdWIYDAayVQIAiSNtc1aOnpirTTeQpom+d1pdHZicgN0mvVdiqLwCsWaFApPa86Ln0nHc92h5usG5fpbeberNmKH2y2edpPB7+2NyzxXdX8Jtob8DYN+t2jgvvczA18j3mPb/MDIO8YkyXRu1GicOCROT4YExTciNjszbhuaF43bDbCu5HJ3ExFi815XeQ8/g14zmElrtjQ9rXutHldqQ7aMRNeF6bSDi9zJiioxIMRHf39tCZ72rShrS0TPAabjX37+S3qCuz9DSu3xnXjYJB9Myu9m9qtg+GxHkE5md+2a9aEFM0e+Vkvr1uaCba8cWiLIyekSxN6fGaPjuYdtlPiDWymEmu9UI73nKQHs/Zv2+0yaGt+fUQtM+Z9WeSnnNZ/xY1F9K+D2eZ3sc0GZPF1nbHXN/4hp/0beyXv7Q2q1M+3eDXWIoDA6yRQMAjakGySvp3XSpszwNfejB3QNzqtycg/vq9Tw6krAq9WYEWPfy/xjE+XtNRQp82KjHVwMxSZJ7JBmW4mIFgXdO2SvvgsZgIF88TU3ETPRB9yZI8PL2VvgMPrnVfmSXQwDsUGGuYG/ICWDnkDsb0bd/eO2cnuhMYSOWWWa/HBrJY++pfX3fd5YF7KycI39oUCwUxpO3ucLmaZtQUWzJP2CZs9irs6XkAcDhRtYf41tdm3AqVHN904vkemG+Tk2Se6/q6X/TPtCi07B5ltdvIM84Bs8LY+dbaZTGPcgHx3l1ezXMb3XN7ruaKV538VbF7Zrf+Swplj8x7MP54sX2Vbem5r860vdeZp7sQn3kOEV/nersDPt3xwrEcAgddGoGAQpE0NatYF3X3elp1lyjydvG5uAsKB0WvTYiqKwLoI/KWl+S1qiRmQ7N40mqrdOH/B3sRseFv64PoJtcvc1EQqbW7C4rqpOrvlvVG2+/gTIxz8TmdvfammfDNw+V3FTBbg4FOnC5lznrgJC4LB7IsjB5wudpJ38xQ6OM+LErrd6YBa8hxdyurFuSdq/swPMf5akvyAaKXgwcGT6QI7uYFgnrE6+Y/2Aqyt/z2hpYaG+N2CDNFM9DM4e00HTSCyPzKRjZPhsTfJyfnMPsH1WnmaPWV8JtDJSB7szO5cxiUTNMTOmBics+G0DgbLod+v5j0Xzqhs0IZNMUGQcz1ehfW9887DBWvSoC9CNtEX0ezmAX1v8sxtX6trZI+aRnJni1zv93YlfL5FFXmNAAKvl0DhIEgbtPW9ec2Yz3R78+Y9nTQf4gWn3n29DKgtAmUXCLooBeNhQif8a0n33mu2GQkzEUlwkyR5k5F4mYbQEdkXdnKSyOQH2a12TFF0DE/HpQnVXfMHQr+XPzAJ39xJ5gY5/IQ5fsICm0EwdTADx69L94IxQybTc2hJ7XmmDc+WbQKNbHbBlBeM38nahBr5Qi8210lH7Qx6/9Lja0/U/HlczsUtOm5ih2B79KbTrPcCmuxYnWBf050q2y3JWestmhtmfafBQ7NqmlvSzTMnYqfkdgerG5eWuew1VWhsSL7ucN7fl73OOZXIs8KfDGDy0pLa5/Lss8arC1/zmNnh/POX7T0X1zU1M67MXPOY4NC/Hq/KOvteMhilZIK8v1Xv33Xv7yW4jGYmvO9H/PFO5oGM6dP7qt7blfz5FgDxGwEEXluBIkGQtKPxgI7OPdKxndtk+oDfMGMLijyBfm01qDgC5RCwXZSkL37IdkmzXU33Z2+cOy4Fg9GluCffOZmgYDB94+34blbFbrLNzHD2JttvsNk/5rt8ohy5T5jNHtl2BPt3XDIPTuJnlIybICA+0PO625jJGibPXrDfR9Qyt0dNc7lPpYPzrua3zUolb+lMywHdM59rcVm6UIHRLjneBAQmDbGkLZKaNRj7vU2mEP9G1P3unZjZ4rwb/jb73Ttm3IlUFwoIbXUejOjM03+Fv3/HBE5m/NBLBCfek3VzBifzkrm599bbGeQGvdnQbF3K/D9zjcyDAxsIO5N5mLp6U1Nv07HB7PsqU50yv+eO+VNkm/PZwCb0PUuPdDlTkfiFclvnvk+LZYLi6xmsNYGQHc/3wF/zqt7b+bodVsLnW4DDbwQQeG0FigZB2tmsjmtL+j+3xnX0uumDHvMPzmvbfCqOQLkFluz38dRFs6dxNxF+VaJPvuMDhJeotzm3ibnsTbZfjrnZODSippFHmVnj4s4QfsJcJBPkF5C94Tug701wVMKPd4x5On1bg5vMebyD7PezmBuglhM5WSkv0DDjj/LM0BV3XpOFM+tNQGKCiEHve2+igWg4CA0yQubz8Gs7buK8/qXBd/9j6xUf5F3QN/Nb9L0baBWYLS6uqgXXmWtqxmI9GCm4W6GNwXff2H1MUPXtHdV9dFrH1mzspxfUrur6BFkXe22y//aYutpuWi0x46K03u+54mPnym0dfp/6AXihi1/iNvO9Wu7Pq3tvu2ctsvwqP9/MZ5HNbLuZtCL1YzMCCFSMQPEgSG+rTv+P/t+p/0/SfMz0uIWnfq2YllIRBNZFwHuSv5pTR2/AzbHhm3Czxgz6blDdZ6spuci+RcYZmafywZwHhUoKPb0/P2+795kvlrQ/5iY9JgNittk2+mMnTNCYOcY/NPPLfzpsgsOmFpNh8yZd0Gq/INTewDyxgZbpBmRu6MwXS07WuV0Sg0DP697njbMxN97OVN9BxYKn1n6QFnSH+/SvETuLmwkAj7Z86dU3OKYCf3s3ttkAr+lMkw0Oi3UWzDTF6d6ZWWcWVnt9/L8FMwvpHTt7Yag02UCi0QTEe5wupGafV/+ec9+z0YcY4VqHX5XNOnya7Ku87/H4MUHZA70lO06szs/Mvcr3drQiL/I6b9u9wlb7+WaOWpzzvibkmEZ0JrWiT9fsgcGLNJBjEEBgtQIlBEGmf/63dvafL1dbOvsjUOsCeW74c1m8J9pmffQmKsgE2a6p7iDxnC5c3pP2b/zJ19wudrnny7Mm82TTbD+g74PgJc/uhVabm4o7XmIlvFtMBiRoY2wXuvDRmVc55Zv+hLu+AAAgAElEQVSb74PNJQVqdkyO6f430+PNDid5N9W269X/3975v0Z17f3+3Yf+A9dQKe3BZKQ/aRuEDqQ6x4QzFkKkmAunKRHG/BD9IcWa5IK1Uo7hkpRiPcJJUku9oPlBA0o9B55IqQiPOSQ2esIdeDwx+lNvY8SWc/VJ7p/g5bPWXnuvtWfvmT2TGTsZ3wHda6/v67XW3rM+6/NZa/tFuI4i2jsnohGGxFPxlG8l6eOpb8+JFmkf9qoE+htQTlrney12SDl9G7OPyDoYQXIOPpYq/Wy0W3r8+QKo9KEyGdyHu7F1k9yC9HK3++RHduW1u5z+UQKQfIenxP5Txbod33R8ju9FGJaSav7MuX2hNH8hC4lAQyI8B7zvZMlBFS+ItUc/qEePp4W0+8l+vm1NhrRPvhMkf3Z8uZf31BZswQt+tlVdXO6/9ftNqhS8k4Vf4mUC1Rr+RwIk8NsTeGV5efn59paCj4H89jVjDUhgExD4+dET8PnZBB3FKpIACZAACZAACZCAReDfLDedJEACJEACJEACJEACJEACJNDwBCgENXwXs4EkQAIkQAIkQAIkQAIkQAI2AQpBNg26SYAESIAESIAESIAESIAEGp4AhaCG72I2kARIgARIgARIgARIgARIwCZAIcimQTcJkAAJkAAJkAAJkAAJkEDDE6AQ1PBdzAaSAAmQAAmQAAmQAAmQAAnYBCgE2TToJgESIAESIAESIAESIAESaHgCFIIavovZQBIgARIgARIgARIgARIgAZsAhSCbBt0kQAIkQAIkQAIkQAIkQAINT4BCUMN3MRtIAiRAAiRAAiRAAiRAAiRgE6AQZNOgmwRIgARIgARIgARIgARIoOEJUAhq+C5mA0mABEiABEiABEiABEiABGwCFIJsGnSTAAmQAAmQAAmQAAmQAAk0PAEKQQ3fxWwgCZAACZAACZAACZAACZCATeCV5eXl57YH3SRAAiRAAiRAAiRAAiRAAiTQyARelcbt3LmzkdvItpFAzQg8ePCAz0/N6DJjEiABEiABEiABEqgNAZrD1YYrcyUBEiABEiABEiABEiABEqhTAhSC6rRjWC0SIAESIAESIAESIAESIIHaEKAQVBuuzJUESIAESIAESIAESIAESKBOCVAIqtOOYbVIgARIgARIgARIgARIgARqQ4BCUG24MlcSIAESIAESIAESIAESIIE6JUAhqE47htUiARIgARIgARIgARIgARKoDQEKQbXhylxJgARIgARIgARIgARIgATqlACFoDrtGFaLBEiABEiABEiABEiABEigNgQoBNWGK3MlARIgARIgARIgARIgARKoUwIUguq0Y1gtEiABEiABEiABEiABEiCB2hCgEFQbrsyVBEiABEiABEiABEiABEigTglQCKrTjmG1SIAESIAESIAESIAESIAEakPg1dpky1xJgARwbxzpI9PJQOw5hZuTKVxO9yMyxZ4ccpjG9B0ru74p5AdbLQ/jXMJ4+iJSP0yge6vxi7g+ncHQ/llkQ/GWJtPoR1zebj5r14cwihFMHGhyA+w74TCVws3JbtixEqX18iknrl003SRAAiRAAiRAAiQQRSBeCJIJ0hfASGjiEpUJ/UiABGIIWIKKCBez7XkM7wLiJvXD+TyGIULMLLIXgP75rCXoDGPYFCOCxby5CV9bMXwhhfT+caTyw4gSk4A1zHwxhgUAC/vTGPOyyI2cwsoluelHWl11QO6C1FvqFSWkdSI9atVBCXRG4FnDzNQKTv1p2BGArNiuUwlmul5ugNyFylERMjgVEuIK09GHBEiABEiABEiABFwC8ULQ1hRSd2bxC5Bs8uLmyzsSIIEXQmANM4OdGLM1RFa5/emQXskTUHB9FGNvTSE/CS1wKWFJ54ULeUxAhCxbADOZ5jBlCVYFwpy3eGJi495ljL11GHmlkYoSomzB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epttrTqBRhGCqg6GGZIACZAACZAACZBAHRPgnqA67hxWjQRIgARIgARIgARIgARIoPoEKARVnylzJAESIAESIAESIAESIAESqGMCFILquHNYNRIgARIgARIgARIgARIggeoToBBUfabMkQRIgARIgARIgARIgARIoI4JUAiq485h1UiABEiABEiABEiABEiABKpPgEJQ9ZkyRxIgARIgARIgARIgARIggTomQCGojjuHVSMBEiABEiABEiABEiABEqg+AQpB1WfKHEmABEiABEiABEiABEiABOqYAIWgOu4cVo0ESIAESIAESIAESIAESKD6BCgEVZ8pcyQBEiABEiABEiABEiABEqhjAhSC6rhzWDUSIAESIAESIAESIAESIIHqE6AQVH2mzJEESIAESIAESIAESIAESKCOCVAIquPOYdVIgARIgARIgARIgARIgASqT4BCUPWZMkcSIAESIAESIAESIAESIIE6JvDK8vLy8zquH6tGAiRAAiRAAiRAAiRAAiRAAlUl8Krktr3ld1XNlJmRwMtC4OdHT/j8vCydzXaSAAmQAAmQAAk0DAGawzVMV7IhJEACJEACJEACJEACJEACSQhQCEpCiXFIgARIgARIgARIgARIgAQahgCFoIbpSjaEBEiABEiABEiABEiABEggCQEKQUkoMQ4JkAAJkAAJkAAJkAAJkEDDEKAQ1DBdyYaQAAmQAAmQAAmQAAmQAAkkIUAhKAklxiEBEiABEiABEiABEiABEmgYAhSCGqYr2RASIAESIAESIAESIAESIIEkBCgEJaHEOCRAAiRAAiRAAiRAAiRAAg1DgEJQw3QlG0ICJEACJEACJEACJEACJJCEAIWgJJQYhwRIgARIgARIgARIgARIoGEIUAhqmK5kQ0iABEiABEiABEiABEiABJIQoBCUhBLjkAAJkAAJkAAJkAAJkAAJNAyBVxumJWwICdQbgfvnsfeTa8lq1XYcM2eacaXjGK5GpWjrQS+u4eqiFXjwa9we2GF5iPMhvumYR8fcAN523KFo3u36jc9xGsdxpmuLE0H8u1dzTv7L5z/Hoz9+iQ9eA1CibbtPXlN5Lp/fh7nMLRx9x85+Hd+fOAt86uVlBym3tCGGgxO3B9+qdjqem+4mmnXATYWfBj77q/ASdj34yh4HRVrce+4WDj75HN2noxP0HuzB1Sv2GG3z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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.3 预定义转义字符集\n",
    "\"\\d\"、\"\\w\"、\"\\s\"等等，它们是以字符'\\'开头，后面接一个特定字符的形式，用来指示一个预定好的含义。\n",
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['aa', '_12a']"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"\\w 匹配任何字母数字及下划线\"\"\"\n",
    "re.findall('\\w+','aa._12a$$')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['.', '$$']"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"\\W 匹配任意非字母数字字符\"\"\"\n",
    "re.findall('\\W+','aa._12a$$')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[' ']"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"\\s 匹配任意空白字符\"\"\"\n",
    "re.findall('\\s','aa bbb123.')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['aa', 'bbb123.']"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"\\S 匹配任意非空字符\"\"\"\n",
    "re.findall('\\S+','aa bbb123.')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['1', '1', '1', '2', '2', '2', '4']\n",
      "['aaazz1112224']\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\\d 匹配任何数字; 相当于[0-9]\"\"\"\n",
    "print(re.findall('\\d','aaazz1112224ccc'))\n",
    "print(re.findall('\\w+\\d+','aaazz1112224ccc'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['aa', 'bbb']"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"\\D 匹配任意非数字  相当于[^0-9]\"\"\"\n",
    "re.findall('\\D+','aa111bbb')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['12']\n",
      "['100']\n",
      "['12', '56', '100']\n",
      "['34', '78', '100']\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\\A 匹配字符串开头\"\"\"\n",
    "s = '12 34\\n56 78\\n100'\n",
    "print(re.findall(r'\\A\\d+',s,re.M))  # 匹配位于字符串开头的数字\n",
    "\"\"\"\\Z 匹配字符串结尾\"\"\"\n",
    "print(re.findall(r'\\d+\\Z',s,re.M))  # 匹配位于字符串结尾的数字\n",
    "# 与^、$比较\n",
    "print(re.findall(r'^\\d+',s,re.M))  # 匹配位于行首的数字\n",
    "print(re.findall(r'\\d+$',s,re.M))  # 匹配位于行尾的数字"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['bc']\n",
      "['bcde']\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\\b 匹配单词边界\"\"\"\n",
    "s = 'abc abcde bc bcd'\n",
    "print(re.findall(r'\\bbc\\b',s))  # 匹配一个单独的单词'bc'\n",
    "\"\"\"\\B 匹配非单词边界\"\"\"\n",
    "print(re.findall(r'\\Bbc\\w+',s)) # 匹配了'abcde'中的'bcde'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.4 其他功能字符\n",
    "'#'、'!'、':'、'-'等，它们只在特定的情况下表示特殊的含义，比如(?#...)就表示一个注释，里面的内容会被忽略。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['ababab']\n"
     ]
    }
   ],
   "source": [
    "\"\"\"无捕获组\"\"\"\n",
    "# '(?:)'无捕获组\n",
    "s = 'ababab abbabb aabaab'\n",
    "print(re.findall(r'\\b(?:ab)+\\b',s)) # 匹配字符中重复的'ab'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['112']"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"\"\"注释\"\"\"\n",
    "re.findall(r'\\d+(?#匹配数字)','aa112bb')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 组的用法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.1 无命名组\n",
    "最基本的组，由一对圆括号括起来的正则式。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['aaa111aaa']\n",
      "['111']\n"
     ]
    }
   ],
   "source": [
    "# '('')'无命名组\n",
    "# 下面以匹配包夹在字母中间的数字为例\n",
    "s = 'aaa111aaa,bbb222,333ccc'\n",
    "print(re.findall(r'[a-z]+\\d+[a-z]+',s))\n",
    "print(re.findall(r'[a-z]+(\\d+)[a-z]+',s))\n",
    "# 可以看到findall函数只返回了包含在'()'中的内容"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.2 命名组\n",
    "命名组形式为：'(?P< name >...)'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "'(?P’ 代表这是一个 Python 的语法扩展, ’<…>’ 里面是你给这个组起的名字，比如你可以给一个全部由数字组成的组叫做 ’num’ ，它的形式就是 ’(?P<num>/d+)’。\n",
    "起了名字之后，我们就可以在后面的正则式中通过名字调用这个组，它的形式如下：\n",
    "'(?P=name)'调用已匹配的命名组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('aaa', 'aaa'), ('fff', 'ggg')]\n",
      "['aaa']\n"
     ]
    }
   ],
   "source": [
    "s = 'aaa111aaa,bbb222,333ccc,444ddd444,555eee666,fff777ggg'\n",
    "print(re.findall(r'([a-z]+)\\d+([a-z]+)',s)) # 找出中间夹有数字的字母\n",
    "print(re.findall(r'(?P<g1>[a-z]+)\\d+(?P=g1)',s)) # 找出被中间夹有数字的前后同样的字母\n",
    "\n",
    "# 从上面的例子看出，调用已被匹配的组是已被匹配的组，也就是说它里面的内容是和前面命名组里的内容是一样的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "'\\number' 通过序号调用已匹配的组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['aaa']"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 正则式中的每个组都有一个序号，序号是按组从左到右，从1开始的数字\n",
    "# 可以通过下面形式来调用已匹配的组\n",
    "re.findall(r'([a-z]+)\\d+\\1',s)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "'(?(id/name)yes-pattern|no-pattern)'判断指定组是否已匹配，执行相应的规则"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('<', 'usr1@mail1'), ('', 'usr2@mail2')]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 如果id/name指定的组在前面匹配成功了，则执行yes-pattern的正则式，否则执行no-pattern的正则式\n",
    "# 比如要匹配一些形如usr@mail的邮箱地址，不过有的写出<usr@mail>，要匹配这两种情况，可以这样写\n",
    "s = '<usr1@mail1> usr2@mail2'\n",
    "re.findall(r'(<)?\\s*(\\w+@\\w+)\\s*(?(1)>)',s)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 基本函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1 findall\n",
    "findall就是在目标字符串中查找符合规则的字符串。\n",
    "#### findall(rule,target[,flag])\n",
    "- 第一个参数是规则，第二个参数是目标字符串，后面还可以跟一个规则选项。\n",
    "- 返回的结果是一个列表，中间存放的是符合规则的字符串。如果没有符合规则的字符串被找到，就返回一个空列表。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Python', 'Python']"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = '123Python456Python789'\n",
    "re.findall(r'Python',s)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 compile\n",
    "compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['111', '222']"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 如果要多次使用统一规则来进行匹配的话，可以使用re.compile函数来将规则预编译\n",
    "# compile(rule[,flag)\n",
    "# 将正则规则编译成一个Pattern对象。\n",
    "# 第一个参数是规则式，第二个选项为规则选项\n",
    "# 返回一个Pattern对象\n",
    "s = '111,222,aaa,bbb,ccc333,444ddd'\n",
    "rule = r'\\b\\d+\\b'\n",
    "compile_rule = re.compile(rule)\n",
    "compile_rule.findall(s)"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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nYvR8v1RZD6UxcVJJHcdgxpUqVlucWdJInqRtj8XnpFAQRJQ1pVxQHY2k8F4Mu55SaiB+1wmGsRSpJ5JtfA/GfG+ISEuGzfoTQMmz1bi2Ns9ehtwETXtGYxEbrDg7ynZtCC5K4P9ab+73OrdXbi6c0RtPDDbb4Byw307MYtLnb/c0JmsbzSBypUtH0FkEuhvqbPZMMLdiEKtE3oXPzVrPun0VRy9rzekkFSTY32oC20aIUJLtjc3fOX8KlI/WJs3+IvmGQmQAAmQAAmQwDIhkJelSGa29ZyqVevY2WpvBlbH1rtVWSl5SAKFSeAXZ1G/DLjT9voaPZGQvCFYnE0D5DC4IUMsNb1xgFyOsxQVl9eh0Xatk53RMIxDyo3Ps1WJQFD2mdCW+04cJ1wmQdKy0UDER4kMWUfVnETyhrWpgcT15Sv11VahiGxigsJbgsvGEl4LYpLlEWxvW17a3qMEkVh50rt1O0XgoLkDw2+nMOJuGlGMVENjeCMI4as2ZZDfw7m2MY/KMgoJkAAJkAAJkMCCEvjdzMzMjOR49+5dbNy4cUEzZ2YkUCgE+PwUSk+znSRAAiRAAiRAAi8TATOGm6f73MuEgm0hARIgARIgARIgARIgARIoZAIURYXc+2w7CZAACZAACZAACZAACZAAKIp4E5AACZAACZAACZAACZAACRQ0AYqigu5+Np4ESIAESIAESIAESIAESICiiPcACZAACZAACZAACZAACZBAQROgKCro7mfjSYAESIAESIAESIAESIAEKIp4D5AACZAACZAACZAACZAACRQ0AYqigu5+Np4ESIAESIAESIAESIAESICiiPcACZAACZAACZAACZAACZBAQROgKCro7mfjSYAESIAESIAESIAESIAEKIp4D5AACZAACZAACZAACZAACRQ0AYqigu5+Np4ESIAESIAESIAESIAESICiiPcACZAACZAACZAACZAACZBAQROgKCro7mfjSYAESIAESIAESIAESIAEXrER3L171z7lMQmQwBwI8PmZAyxGJQESIAESIAESIIFlRMAnit5a/+YyqhqrQgIrh8CDh4/B52fl9BdrSgIkQAIkQAIkQAJCQMZw8qH7HO8HEiABEiABEiABEiABEiCBgiZAUVTQ3c/GkwAJkAAJkAAJkAAJkAAJUBTxHiABEiABEiABEiABEiABEihoAhRF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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "compile函数还可以指定一些规则标志，来指定一些特殊选项。多个选项之间用‘|’连接起来,具体规则标志如下：\n",
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['123']\n",
      "['123', '789', '888']\n",
      "['233']\n",
      "['456', '666', '233']\n"
     ]
    }
   ],
   "source": [
    "s = '123 456\\n789 666\\n888 233'\n",
    "rc = re.compile(r'^\\d+') # 匹配一个位于开头的数字，没有使用M选项\n",
    "print(rc.findall(s))\n",
    "rcm = re.compile(r'^\\d+',re.M) # 使用M选项\n",
    "print(rcm.findall(s))\n",
    "\n",
    "rc = re.compile(r'\\d+$')\n",
    "print(rc.findall(s))\n",
    "rcm = re.compile(r'\\d+$',re.M)\n",
    "print(rcm.findall(s))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于compile函数编译生成的Pattern对象，它同样有findall,match,search,finditer,sub,subn,split这些函数，不过这几个函数的参数有所变化（可以指定查找开始位置和结束位置），具体变化如下：\n",
    "- findall(targetString[,startPos[,endPos]])\n",
    "- finditer(targetString[,startPos[,endPos]])\n",
    "- match(targetString[,startPos[,endPos]])\n",
    "- search(targetString[,startPos[,endPos]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "除了有和re模块的函数同样的函数外，Pattern对象还多了以下属性：\n",
    "- flags 查询编译时的选项\n",
    "- pattern 查询编译时的规则\n",
    "- groupindex 规则里的组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "34\n",
      "(?P<word>/b[a-z]+/b)|(?P<num>/b/d+/b)|(?P<id>/b[a-z_]+/w*/b)\n",
      "{'word': 1, 'num': 2, 'id': 3}\n"
     ]
    }
   ],
   "source": [
    "p = re.compile(r'(?P<word>/b[a-z]+/b)|(?P<num>/b/d+/b)|(?P<id>/b[a-z_]+/w*/b)',re.I)\n",
    "print(p.flags)  # re.I对应为34\n",
    "print(p.pattern) # 查看规则\n",
    "print(p.groupindex)  # 以字典形式返回每个组名和组的序号"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.3 match与search\n",
    "match函数的作用是尝试从字符串string的起始位置开始匹配一个模式pattern，如果匹配成功返回一个匹配成功后的Match对象，否则返回None。\n",
    "search函数扫描整个字符串并返回第一次成功的匹配对象，如果匹配失败，则返回None。\n",
    "- match(rule,targetString[,flag])\n",
    "- search(rule,targetString[,flag])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一个参数是正则规则，第二个是目标字符串，第三个是选项。若匹配成功则返回一个MAtch对象，失败无返回"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<_sre.SRE_Match object; span=(0, 3), match='www'>\n",
      "None\n",
      "<_sre.SRE_Match object; span=(0, 3), match='www'>\n",
      "<_sre.SRE_Match object; span=(11, 14), match='com'>\n",
      "Cats are smarter than dogs\n",
      "Cats\n",
      "smarter\n"
     ]
    }
   ],
   "source": [
    "# match与search唯一的区别是：\n",
    "# match从字符串的开头开始匹配，如果开头位置没有匹配成功，则匹配失败\n",
    "# 而search匹配整个字符串，直到找到一个匹配。\n",
    "\n",
    "s = 'www.abcdef.com'\n",
    "print(re.match('www',s)) # 在起始位置匹配\n",
    "print(re.match('com',s))  # 不在起始位置匹配\n",
    "\n",
    "print(re.search('www',s)) # 在起始位置匹配\n",
    "print(re.search('com',s)) # 不在起始位置匹配\n",
    "\n",
    "# 注意,如果匹配不成功，它们则返回一个NoneType。所以在对匹配完的结果进行操作之前，需要先判断一下是否匹配成功了\n",
    "\n",
    "lines = 'Cats are smarter than dogs'\n",
    "matchObj = re.match(r'(.*) are (.*?) .*',lines, re.M|re.I)\n",
    "if matchObj:\n",
    "    print(matchObj.group())\n",
    "    print(matchObj.group(1))\n",
    "    print(matchObj.group(2))\n",
    "else:\n",
    "    print(\"No match!\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('Tom', '24', '66666')\n",
      "Tom\n",
      "Tom\n",
      "Tom 24 66666 <=\n",
      "Tom 24 66666 <=\n"
     ]
    }
   ],
   "source": [
    "# 组的名字与序号\n",
    "# 正则式中的每个组都有一个序号，它是按定义时从左到右的顺序从 1 开始编号的。其实， re 的正则式还有一个 0 号组，它就是整个正则式本身。\n",
    "s = 'Tom 24 66666 <='\n",
    "p = re.compile( r'(?P<name>[a-z]+)\\s+(?P<age>\\d+)\\s+(?P<tel>\\d+).*' , re.I )\n",
    "m = p.search(s)\n",
    "print(m.groups()) # 查看匹配的各组的情况\n",
    "print(m.group('name')) # 使用组名获取匹配的字符串\n",
    "print(m.group(1)) # 使用组序号获取匹配的字符串，同使用组名的效果一样\n",
    "print(m.group(0)) # 等同于m.group()\n",
    "print(m.group())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Match对象的方法\n",
    "- group([index|id])：获取匹配的组，缺省返回组0，也就是全部值\n",
    "- groups()：返回全部的组\n",
    "- groupdict()：返回以组名为key，匹配的内容为values的字典"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'name': 'Tom', 'age': '24', 'tel': '66666'}\n",
      "0\n",
      "3\n",
      "(0, 3)\n",
      "name is Tom,age is 24,tel is 66666\n"
     ]
    }
   ],
   "source": [
    "print(m.groupdict())  # 查看匹配的内容\n",
    "\n",
    "# start([group]) 获取匹配的组的开始位置\n",
    "# end([group]) 获取匹配的组的结束位置\n",
    "# span([group]) 获取匹配的组的（开始，结束）位置\n",
    "\n",
    "print(m.start('name'))\n",
    "print(m.end('name'))\n",
    "print(m.span('name'))\n",
    "\n",
    "# expand(template) 根据一个模板用找到的内容替换模板里的相应位置\n",
    "print(m.expand(r'name is \\g<1>,age is \\g<age>,tel is \\3'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Match除了以上这些函数外，Match对象还有这些属性\n",
    "- pos 搜索开始的位置参数\n",
    "- endpos 搜索结束的位置参数\n",
    "- lastindex 最后匹配的组的序号\n",
    "- lastgroup 最后匹配的组名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "15\n",
      "3\n",
      "tel\n"
     ]
    }
   ],
   "source": [
    "print(m.pos)  # 查看开始位置参数\n",
    "print(m.endpos)  # 查询搜索结束的位置参数\n",
    "print(m.lastindex) # 最后匹配的组的序号\n",
    "print(m.lastgroup) # 最后匹配的组名"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.4 finditer\n",
    "finditer函数跟findall函数类似，但返回的是一个迭代器， 而不是一个像findall函数那样的存有所有结果的list。\n",
    "- finditer(rule,target[,flag])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "finditer函数和findall函数的区别：\n",
    "- findall返回所有匹配的字符串，并存在一个列表中\n",
    "- finditer则并不直接返回这些字符串，而是返回一个迭代器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "111 (0, 3)\n",
      "222 (4, 7)\n",
      "333 (8, 11)\n",
      "444 (12, 15)\n"
     ]
    }
   ],
   "source": [
    "s = '111 222 333 444'\n",
    "for i in re.finditer(r'\\d+',s):\n",
    "    print(i.group(),i.span())  # 打印每次得到的字符串和起始结束位置"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.5 sub 与 subn\n",
    "re模块还提供了对字符串的替换和修改函数。sub和subn函数都用于替换字符串中的匹配项。\n",
    "- sub(rule,replace,target[,count])\n",
    "- subn(rule,replace,target[,count])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一个参数为正则规则，第二个参数指定用来替换的字符串，第三个参数是目标字符串，第四个参数是最多替换次数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "sub和subn的区别：\n",
    "- sub返回一个被替换的字符串\n",
    "- subn返回一个元组，第一个元素是被替换的字符串，第二个元素是一个数字，表明产生了多少次替换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python c Python c++ Python\n",
      "Python c Python c++ java\n",
      "('Python c Python c++ Python', 3)\n"
     ]
    }
   ],
   "source": [
    "s = 'java c java c++ java'\n",
    "print(re.sub(r'java','Python',s)) # 将所有java替换成Python\n",
    "print(re.sub(r'java','Python',s,2)) # 只替换前两个\n",
    "print(re.subn(r'java','Python',s)) # 可以查看发生了多少次替换"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.6 split\n",
    "split方法能够将字符串分割后返回列表。split为切片函数，使用指定的正则规则在目标字符串中查找匹配的字符串，用它们作为分界，把字符串切片。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "split(rule,target[,maxsplit])\n",
    "- 第一个参数是正则规则，第二个参数是目标字符串，第三个参数是最多切片次数\n",
    "- 返回一个被切完的子字符串的列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['aaa', 'bbb', 'ccc']"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = 'aaa , bbb , ccc'\n",
    "re.split(r'\\s*,\\s*',s)  # 以','分隔开，同时去掉逗号前后的空格"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
